第十章 Matlab数字信号处理

第十章 Matlab数字信号处理——10.1——10.6

10.1信号/系统/信号处理的基本概念

1. 信号

2.系统

3.信号处理

包括滤波/变换/检测/谱分析/估计/压缩/识别等一系列加工处理

4.MATLAB中信号的表示

模拟信号在数学上表示为一个时间连续函数 f(t)。数字信号是指时间离散而且幅度也离散的信号,在数学上可以表示为有限精度的一个离散时间序列(x1,x2,…,xn,…)。
对模拟信号进行时间域采样,就获得了时间域离散的采样信号。如果采样频率满足奈奎斯特采样定理,即采样频率大于或等于模拟信号最高频率的2倍,那么模拟信号可以由其采样值序列构成的时间离散信号无失真地表达。
对时间离散信号再进行量化,就获得了幅度离散的样值序列,也就是数字信号(模拟信号时间离散,幅值量化)。量化将引入量化误差,形成量化噪声成分。当量化足够精细时,量化噪声可以忽略。这时就认为,所获得的数字信号就无失真地代表了原来的模拟信号。
在数字信息机中所能够存储的是数字序列,也即模拟信号必须通过采样和量化后,变成相应的数字信号,才能被计算机存储和处理。最后,可以将处理结果序列以采样频率送入理想低通滤波器,恢复为所需的模拟信号
对于音频来说,实现模拟音频信号与数字音频信号之间的转化模块就是声卡, MATLAB 可以方便地对声卡进行诸如采样率等输入/输出参数的配置,从而实现录音和播放,而且其声卡操作函数是跨操作平台的,也是与硬件无关的。

10.2 信号的产生

10.2.1 正余弦波的产生

确定周期信号的产生一般需要考虑以下问题:首先,要设置采样频率,将模拟信号离散化,采样频率的设置要满足采样定理,为了信号波形显示光滑、好看,一般采样频率设置为信号最高频率的5~20倍;然后,确定所要产生的信号的持续时间长度再确定信号的其他参数,如幅度、相位等;最后绘制信号波形图,验证正确性。如果信号频率为音频(20Hz-20kHz),则可以用sound函数从声卡输出信号波形。
【例】
产生一个频率为150Hz,幅度为0.45,初始相位为35°的正弦波,信号持续时间为5s。绘制波形图从声卡输出。

clear all;
Fs=2000;  %采样率
t=1/Fs:1/Fs:5; %信号持续时间范围
f=150;  %正弦波频率
A=0.45 ; %幅度
Fi=35/180*pi %相位
X=A*sin(2*pi*f.*t+Fi); %正弦波计算
plot(t(1:100),X(1:100));%绘制波形图前100样点
xlabel('时间/s');ylabel('sin2\pi ft');
title('150Hz 正弦波')
disp('按任意键开始播出5s的150Hz正弦波');
pause;
sound(X,Fs);
disp('播放结束');

10.2.2 周期方波和周期三角波的产生

MATLAB信号工具箱中的square函数可以产生方波sawtooth函数可以产生三角波(锯齿波),类似sin(t),只不过不是正弦波

square函数的调用格式 sawtooth函数的调用格式
x = square ( t )): x= sawtooth ( t )
返回周期为2π的方波,采样时刻由向量 t 指定 产生周期为2π的锯齿波,采样时刻由向量 t 指定
x = square ( t , duty ): sawtooth ( t , width )
产生给定占空比的方波。占空比 duty 是信号为正值的比例 产生三角波, width 指定最大值出现的位置,其取值为0~1,1对应于2元。当 t 由0增大到 width *2π时,函数值由﹣1增大到1;当 t 由 width *2π增大到2元时,函数值由1减小到一1。因此当 width =0.5时,产生的是关于时刻π对称的、峰值为1的三角波。
clear;
t=linspace(-pi,2*pi,121); %序列
x=1.15*square(2*t);       %方波
subplot(211);
plot(t/pi,x,'.-',t/pi,1.15*sin(2*t));
xlabel('t/\pi');title('方波');
grid on
x2=sawtooth(2*pi*50*t);
subplot(212);
plot(t,x2);
xlabel('t/\pi');
grid on
title('三角波');

图像

10.2.3任意确定周期信号的产生

给定周期信号在一个周期内的波形样点值,就可以通过样值的周期重复来获得任意确定的周期信号。

% 10.2.3任意确定周期信号的产生
%给定的某心电波一个周期的波形数据为n(共37个采样点,采样间隔为0.02s)请绘出采样率为200次/s...
% 和8000次/s的心电波形图
clear
n=[78.0 -39.5 -70.7 -17.0 -16.5 -16.5 -15.0 -15.0 -14.5 -10.0 -3.5 1.0 -3.5...
    -12.0 -16.0 -17.0 -18.0 -18.0 -18.0 -18.0 19.0 6.5 -11.0 -17.0 -17.0 -18.0...
    -23.0 -18.3 49.0];
%一个心跳周期的数据
Ts=0.02; %采样时间间隔
Fs=1/Ts; %采样率=1/采样时间间隔
m=10;    %将信号扩展为m个周期
nm=reshape(n'*ones(1,m),1,m*length(n));
nm=nm/max(nm);%归一化
t=Ts:Ts:length(nm)*Ts;%采样时间刻度
subplot(2,1,1)
plot(t,nm,'r.') %点图
axis([0 2 -2 2]);
%下面为"听"心跳,需要采用插值方法将波形采样率提高到声卡所能允许的值,如8000次/s
tt=Ts:1/8000:t(length(t));%新的采样时间刻度
nn=interp1(t,nm,tt,'spline');%一维数据插值(表查找)          
subplot(2,1,2);
plot(tt,nn,'k.')
axis([0 2 -2 2]);
sound(nn,8000);%听心跳

10.2.4 脉冲信号的产生

%%
%10.2.4 脉冲信号的产生
%一些主要的脉冲函数
%  y=rectpuls(t,w);%矩形脉冲
%  y=tripuls(T,w,s);%三角脉冲;
%  y=diric(x,n);%狄拉克函数脉冲(冲激脉冲)
%  y=gauspuls(t,fc,bw,bwr)%高斯调制的正弦脉冲
%  y=pulstran(t,d,'func')%脉冲串
%  y=sinc(x)%采样函数sinc脉冲

10.2.5 扫频信号的产生

chirp函数用于获得在设定频率范围内按照设定方式进行的扫频信号。

调用格式 解释
y=chirp(t,f0,t1.f1) 产生一个线性扫频(频率随时间线性变化)的采样信号,时间轴设置由数组t定义。时刻0的瞬时频率为f0;时刻t1的瞬时频率为f1(默认f0=0,t1=1,f1=100)
y=chirp(t,f0,t1.f1,‘method’) 指定改变扫频的方法。“linear”“”quadratic“(二次调频)”logarithmic“(对数调频)
y=chirp(t,f0,t1.f1,'method‘,phi) 指定初始相位
y=chirp(t,f0,t1.f1,'quadratic‘,phi,‘shape’) 指定形状的二次扫频信号的频谱图。形状为凹/凸(downsweep(f0>f1)凸形)
%%
%10.2.5 扫频信号的产生
%以1000Hz的采样频率,在3s采样时间内,生成一个起始时刻瞬时频率10Hz,3s瞬时频率为100Hz的线性调频信号
%并绘制其曲线以及光谱图
clear
fs=1000%采样频率
t=0:1/fs:3;
y=chirp(t,0,1,100);
subplot(211)
plot(t(1:500),y(1:500));
xlabel('(a)线性调频信号')
t1=0:1/fs:3;
subplot(212)
y1=chirp(t1,100,1,200,'quadratic');
spectrogram(y1,128,120,128,1000,'yaxis')%线性调频信号的光谱图
xlabel('(b)相频图');
set(gcf,'Color','W');%设置背景颜色为白色

在这里插入图片描述
链接: spectrogram()函数
短时傅里叶变换(STFT)可以有效地处理非平稳数字信号,给出瞬时频率的信息。STFT的本质就是将一段信号截成多段,对每一段进行单独傅里叶变换(FFT),最后在时域上接起来,就形成了STFT的结果。Matlab中关于STFT的函数是spectrogram,有界面化与代码两种方式。

10.2.5 随机信号的产生

MATLAB中可利用rand/randn产生两种随机信号

调用格式 解释
rand(1,N) 在区间上产生N点均匀分布的随机序列
randn(1,N) 产生均值为0/方差为1的高斯随机序列,即白噪声序列

10.3 连续信号的时域运算

在信号的传输/加工/处理过程中,常常需要对信号进行运算,信号的基本运算组合要包括加(减)/相乘/反褶/移位/尺度变换/线性卷积

10.3.1 信号的加(减)/乘运算

10.3.2 信号的反褶/移位/尺度变换

1.反褶
反褶是将信号 x (t)的自变量 t 变成- t 后得到一个新的信号 x(-t )。反褶是信号波形以 t =0轴为中心的180°翻转。同样,信号 x ( t )反褶后非零值区间的分布也可能发生变化。
2.移位
移位是将信号 x ( t )的自变量 t 变成 t 士 t0后得到一个新的信号 x(t± t0),其中x(t+t0)为x(t)的左移信号,又称超前信号x (t - t0为x(t)的右移信号,又称延时信号。移位是信号波形沿着时间轴 t 的整体平移,信号 x ( t )移位后信号非零区可能会发生变化。
3.尺度变换
尺度变换是将信号 x(t)的自变量 t 换成 at 得到一个新的信号 x ( at )。尺度变换是信号波形沿时间轴 t 压缩( a >1)或者扩展( a <1)为原来的1/a倍。

MATLAB实现信号的移位/尺度变换只需要将自变量做相应的变化,实现信号的反褶要调用fliplr(x)

%%
%10.3.2 信号的反褶/移位/尺度变换
%实现一个矩形脉冲的移位/反褶/尺度变换
clear;
t=-6:0.01:6;
x1=rectpuls(t+1,4);
t1=t+1;
t2=-fliplr(t);
t3=t/2;
y2=fliplr(x1);
subplot(4,1,1);plot(t,x1);grid on;
xlabel('x1(t)');title('原矩形信号');

subplot(4,1,2);plot(t1,x1);grid on;
xlabel('x1(t+1)');title('信号左移');

subplot(4,1,3);plot(t2,y2);grid on;
xlabel('x1(-t)');title('信号反褶');

subplot(4,1,4);plot(t3,x1);grid on;
xlabel('x1(t/2)');title('尺度变换');

请添加图片描述

10.3.2 信号卷积

卷积运算可用于计算线性系统的时间相位。用conv/conv2/convn实现卷积运算

10.4 时域分析(待补充)

时域分析法是以拉普拉斯变换为工具,从传递函数出发,直接在时间域上研究系统的一种方法。
一个动态系统的性能常用典型输入作用下的响应来描述。响应是指零初始值条件下,某种典型的输入函数作用下对象的响应,控制系统常用的输入函数为单位阶跃函数和脉冲激励函数。

10.4.1脉冲响应

函数 impulse 将绘制出连续时间系统在指定时间范围内的脉冲响应 h ( t )的时域波形图,并求出指定时间范围内脉冲响应的数值解。函数的调用格式为:
impulse (sys):计算并在当前窗口绘制线性对象 sys 的脉冲响应,可用于单输入单输出或多输入多输出的连续时间系统或离散时间系统。
impulse ( sys , Tfinal)或 impulse ( sys , t ):定义计算时的时间向量。用户可以指定仿真终止时间,这时 t 为标量;也可以通过 t =0:dt: Tfinal 命令设置一个时间向量。对于离散系统,时间间隔 dt 必须与采样周期匹配。
impulse (sys1,sys2,…, sysN ). impulse (sys1,sys2,…, sysN , Tfinal ). impulse ( sysl ,sys2,…, sysN , t ):定义仿真绘制属性。
[ y , t ]= impulse ( sys )、[ y , t ]= impulse ( sys , Tfinal )、 y = impulse ( sys , t )、[ y , t , x ]= impulse ( sys ).[ y , t , x , ysd ]= impulse ( s 输出响应向量; t 为时间向量; x 为状态系统轨迹数据; ysd 为返回的标准偏差。

10.4.2 单位阶跃响应

10.4.3 任意输入的响应

10.5 频域分析

10.5.1 傅里叶变换的定义

如果x(n)绝对可加(取绝对值后,从-∞到+∞积分的和<∞),
则其离散傅里叶变换定义:
X ( e j w ) = F [ x ( n ) ] = ∑ − ∞ + ∞ x ( n ) e − j w n X(e^{jw} )=F[x(n)]=\sum_{-∞}^{+∞} x(n)e^{-jwn} X(ejw)=F[x(n)]=+x(n)ejwn
X ( e j w ) X(e^{jw}) X(ejw)的离散时间傅里叶逆变换(IDTFT)可表示为:
X ( n ) = F − 1 [ x ( e j w ) ] = 1 2 ∫ − π π X ( e j w ) x ( e j w n ) d w X(n)=F^{-1} [x(e^{jw)}]=\frac{1}{2} \int_{-\pi}^{\pi} X(e^{jw)}x(e^{jwn)}dw X(n)=F1[x(ejw)]=21ππX(ejw)x(ejwn)dw

则其离散傅里叶变换定义: 离散时间傅里叶逆变换(IDTFT)
X ( e j w ) = F [ x ( n ) ] = ∑ − ∞ + ∞ x ( n ) e − j w n X(e^{jw} )=F[x(n)]=\sum_{-∞}^{+∞} x(n)e^{-jwn} X(ejw)=F[x(n)]=+x(n)ejwn X ( n ) = F − 1 [ x ( e j w ) ] = 1 2 ∫ − π π X ( e j w ) x ( e j w n ) d w X(n)=F^{-1} [x(e^{jw)}]=\frac{1}{2} \int_{-\pi}^{\pi} X(e^{jw)}x(e^{jwn)}dw X(n)=F1[x(ejw)]=21ππX(ejw)x(ejwn)dw
离散时间傅里叶变换的重要特性
(1)周期性:离散时间傅里叶变换 X ( e j w X(e^{jw} X(ejw)是w的周期函数,周期是 2 π 2\pi 2π
(2)对称性:对于实值的x(n), X ( e j w X(e^{jw} X(ejw共轭对称
%%
%10.5.1 傅里叶变换的定义
%已知序列x(n)={1,2,3-,4,5,6},求x(n)的离散时间傅里叶变换,在[0,pi]中取501
%个等间隔频点上进行数值计算
clear
%输入序列
n=-2:3;
x=1:6;
%把[0,pi]中取501个点
k=0:500;
w=(pi/500)*k;
R=k/500;
%进行DTFT
X=x*(exp(-j*pi/500)).^(n'*k);
magX=abs(X);
angX=angle(X);
realX=real(X);
imagX=imag(X);
subplot(2,2,1);plot(R,magX);
grid on;xlabel('(a)幅度部分');
subplot(2,2,2);plot(R,angX);
grid on;xlabel('(b)相位部分');
subplot(2,2,3);plot(R,realX);
grid on;xlabel('(c)实部部分');
subplot(2,2,4);plot(R,imagX);
grid on;xlabel('(d)虚部部分');

10.5.2系统的复频域分析

1.系统函数的定义
2.系统的稳定性

10.6 频谱分析

对于连续非周期信号频谱的数值计算必须首先对信号进行时域采样,得到时间离散化的信号,时域采样必须满足或近似满足采样定理,根据时域频域的对应关系,时域采样将导致得到的采样信号频谱周期化。为了使得周期化后的采样信号频谱便于计算机处理,还必须将这个频谱进行离散化****,方法是对该频谱进行采样。根据时域频域的对应关系,频域离散化将对应于时域信号的周期化。因此,对连续非周期信号的频谱数值计算时,**要确定怎样截取信号的时间段,怎样选择时域采样率,以及怎样在某时间段上对信号进行截取。****截取信号的时间段的长度决定了时域周期化的周期,相应地对应于频域采样的间隔,即频率分辨率。**时域采样率决定了频域周期化的周期,即频谱数值计算的范围。而在某时间段上对信号进行截取方法,也即不同窗函数的应用,决定了信号频谱估计的精确度和实用范围。

设连续非周期信号为 f ( t ),要分析该信号在频率范围[0, fm]的频谱,而要求分析的频率分辨率为△ fHz , 则依照以下3个步骤计算。

1)根据该信号的频率范围确定采样率

要分析该信号在频率范围[0, fm]的频谱,采样率 fs,必须满足采样定理: fs≥2fm。相应地,采样时间间隔 T (也称为时间分辨率)满足: T ⩽ 1 2 f m T\leqslant \frac{1}{2f_{m} } T2fm1
2)根据频率分辨率要求确定分析信号 f ( t )的截取时间段长度

要使得分析的频率分辨率达到△ f ,即每隔频率△ f 计算一个频率点,那么对信号的截取时间长度 L 必须满足: L ≥ 1 △ f \frac{1}{\bigtriangleup f } f1
根据截取时间长度 L 和采样时间间隔 T ,可以计算出截取时间信号离散化后的点数 N ,即:
N =[ L   T \frac{L}{\ T }  TL]+1
相应地,在频域上,由采样率 f s和频率分辨率△ f 也可以计算出截取时间信号离散化后的点数 N ,即:
N =[ L   T \frac{L}{\ T }  TL]+1=[ f s △ f \frac{fs}{\bigtriangleup f } ffs]+1
3)根据信号时域波形特征应用不同的窗函数

可以使用不同的窗函数对时间无限长的连续时间信号 f(t)进行时间段截取。(为了减少FFT所截取的数据段前后的跳变,可以对数据先乘以一个窗函数,使得其前后数据能平滑过渡)
每次FFT变换只能对有限长度的时域数据进行变换,因此需要对时域信号进行信号截断,即使是周期信号,如果截断的时间长度不是周期的整数倍(整周期截断),那么截取后的信号将会存在频谱泄漏,为了将这个泄漏误差减少到最小程度(不是消除),我们需要使用窗函数。加窗主要是为了使时域信号似乎更好的满足FFT处理的周期性要求,减少泄漏。

MATLAB 信号处理工具箱中,计算窗函数的指令为 window 。
函数的调用格式为: window :打开一个窗函数的设计图形化界面。
w = window ( fhandle , n ):返回由 fhandle 指定的 n 点窗的数值。
w = window ( fhandle , n , winopt ):参数 winopt 为相应窗函数的参数选项。
常用窗函数的fhandle参数如表10-1所示。handle参数均以@符号开头。另外,MATLAB也提供了以fhandle参数名(去掉@符号)为指令的窗函数,例如矩形窗函数可通过命令“w=window(@rectwin,n)”得到,也可以通过命令“w=rectwin(n)”得到。
请添加图片描述
1、矩形窗。矩形窗属于时间变量的零次幂窗,矩形窗使用最多,习惯不加窗就是使信号通过了矩形窗。这种窗的优点是主瓣比较集中,缺点是旁瓣较高,并有负旁瓣,导致变换中带进了高频干扰和泄漏,甚至出现负谱现象;

2、三角窗。三角窗亦称费杰窗,是幂窗的一次方形式,与矩形窗比较,主瓣宽约等于矩形窗的两倍,但旁瓣小,而且无负旁瓣;

3、汉宁窗。又称余弦窗,汉宁窗可以看做是3个矩形时间窗的频谱之和。汉宁窗主瓣加宽并降低,旁瓣则显著减小,从减小泄漏观点出发,汉宁窗优于矩形窗,但汉宁窗主瓣加宽,相当于分析带宽加宽,频率分辨力下降;
4、海明窗。海明窗与汉宁窗一样,也是余弦窗的一种,只是加权系数不同,海明窗加权的系数能使旁瓣达到更小,分析表明,海明窗的第一旁瓣衰减为-42dB,但其旁瓣衰减速度为20dB/(10oct),这比汉宁窗衰减速度慢;

5、高斯窗。高斯窗是一种指数窗,它无负的旁瓣,第一旁瓣衰减达-55dB,高斯负谱的主瓣较宽,故而频率分辨力低,高斯窗函数常被用来截断一些非周期信号。
  
链接: link

设计完成的窗函数数据可以采用wvtool函数显示时域波形和频域特性。

%%
%10.6 频谱分析
%设计完成的窗函数数据可以**采用wvtool函数显示时域波形和频域特性。**
%使用如下代码可以得到64点的海明窗/汉宁窗/高斯窗的时域频域特性对比
wvtool(hamming(64),hann(64),gausswin(64));

使用窗函数可以控制频谱主瓣宽度,旁瓣抑制度等参数,更好地进行波形频谱分析和滤波器参数设计。将窗函数与信号的时域波形或频谱进行相乘的时候,就称为对信号进行时域加窗/频域加窗

【例】对一个50Hz/振幅为1的正弦波以及一个75Hz/振幅为0.7的正弦波的合成波形进行频谱分析,%要求分析的频率范围为0——100Hz,频谱分辨率为1Hz

%%
%10.6 频谱分析
%设计完成的窗函数数据可以**采用wvtool函数显示时域波形和频域特性。**
%使用如下代码可以得到64点的海明窗/汉宁窗/高斯窗的时域频域特性对比
%wvtool(hamming(64),hann(64),gausswin(64));

%对一个50Hz/振幅为1的正弦波以及一个75Hz/振幅为0.7的正弦波的合成波形进行频谱分析,
%要求分析的频率范围为0——100Hz,频谱分辨率为1Hz
%分析:根据分析的频率范围可以确定信号的时域采样率为fs=200Hz,时间分辨率为T=1/fs=5ms而根据频率分辨率可以得到信号的时域截断长度为L=1/Δf=1s。因此,对截断信号的采样点数为N=
%N=[fs/Δf]+1=201;;现分别用矩形/海明窗/汉宁窗进行时域加窗,得到幅度谱曲线,
clear 
fs=200;%设采样率
Delta_f=1;%频率分辨率(频率采样间隔)
T=1/fs;%时间分辨率(时域采样间隔)
L=1/Delta_f;%时域截取长度
N=floor(fs/Delta_f)+1;%截取信号的采样点数
t=0:T:L;%截取时间段和采样时间点
freq=0:Delta_f:fs;%分析的频率范围和频率分辨率
f1=(sin(2*pi*50*t)+0.7*sin(2*pi*75*t))'; %在截取范围内分析信号时域波形
f1_rectwin=rectwin(N).*f1;  %时域加窗:矩形窗
f1_hamming=hamming(N).*f1;  %时域加窗:海明窗
f1_hann=hann(N).*f1;  %时域加窗:汉宁窗
Fw_rectwin=T.*fft(f1_rectwin,N)+eps;  %作N点DFT,乘以采样时间间隔T得到频谱
Fw_hamming=T.*fft(f1_hamming,N)+eps;  %加海明窗的频谱
Fw_hann=T.*fft(f1_hann,N)+eps;  %加汉宁窗的频谱

figure;
subplot(2,2,1);plot(t,f1);xlabel('(a)原始信号');
subplot(2,2,2);plot(t,f1_rectwin);xlabel('(b)矩形窗');
subplot(2,2,3);plot(t,f1_hamming);xlabel('(c)海明窗');
subplot(2,2,4);plot(t,f1_hann);xlabel('(d)汉宁窗');
figure;
subplot(3,1,1);semilogy(freq,abs(Fw_rectwin));%半对数图
xlabel('(a)矩形窗频谱');
axis([0 200 1e-4 1]);
grid on;
subplot(3,1,2);semilogy(freq,abs(Fw_hamming));
xlabel('(b)海明窗频谱');
axis([0 200 1e-4 1]);
grid on;
subplot(3,1,3);semilogy(freq,abs(Fw_hann));
xlabel('(c)汉宁窗频谱');
axis([0 200 1e-4 1]);
grid on;

【补充1】
在这里插入图片描述
【补充2】
详情见链接
【待学习↑↓】
http://t.csdn.cn/N48n5
http://t.csdn.cn/nMiXg

【待补充↓】

10.7 谱估计

10.8 IIR滤波器

## 10.9 FIR滤波器

【待学习】
DTFT和DFT有何区别 http://t.csdn.cn/JduGA
DFT做频谱分析再理解http://t.csdn.cn/N48n5
DFT泄露问题和DFT的频率轴表示方法(第三章离散傅里叶变换(3.8,3.13.4)学习笔记)http://t.csdn.cn/nMiXg

参考文献:
MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著)
MATLAB从入门到实战;李晓东(编著)

猜你喜欢

转载自blog.csdn.net/weixin_62993348/article/details/131032613