当前位置:文档之家› Matlab数字信号处理

Matlab数字信号处理

Matlab数字信号处理1、信号的产生2、信号的运算3、差分方程与Z变换4、快速傅里叶变换5、数字滤波器的设计6、使用中的一些技巧、单位阶跃序列x=ones(1,n);n=1:N;y = square(2*pi*30*t);●8、三角波(锯齿波)●sawtooth(t,width);●产生周期为2*pi幅值为正负1的三角波,●width为宽度,取0-1之间的数●例:t = 0:.0001:.0625;●y = sawtooth(2*pi*30*t,1);●plot(t,y);●sawtooth函数类似于sin函数,其中width用于调整三角波峰值位置,sawtooth(t,1)等价于sawtooth(t)。

二、信号的运算●1、信号的延迟●给定信号x(n),若信号y1(n)、y2(n)分别定义为:●y1(n)=x(n-k)●y2(n)=x(n+k)●那么,y1(n)是整个x(n)在时间轴上右移k个时间单位所得到的新序列,y2(n)是整个x(n)在时间轴上左移k个时间单位所得到的结果。

●编程实现:●function [y,n]=sig_shift(x,m,n0)●m为输入x的下标;n0为延迟单位●n=m+n0;●y=x;●2、相加、相乘●x(n)=x1(n)+x2(n);●x(n)=x1(n)*x2(n)●当两个向量相乘时,若用.*表示数组相乘,●此时,x1中对应元素与x2中对应元素相乘,所得结果作为结果数组(矩阵),要求两原始数组中元素个数相同,如果采用*是进行向量(矩阵)的乘法,相加时要求两原始数组中元素个数相同。

●4、信号的折叠●信号折叠就是对x(n)每一项对n=0的纵坐标进行折叠,即: y(n)=x(-n)●y(n)与x(n)关于n=0对称;●y=fliplr(x);●n=-fliplr(n);●在实际应用中,fliplr的主要作用是把序列倒转,●例:x=[1,2,3;4,5,6];●y=fliplr(x);●%y=[3,2,1;6,5,4]●●6、信号的卷积●Matlab提供了内部函数conv来实现两个有限长序列的卷积,该函数假定两个序列的是从n=0开始的。

●例:x=[3,11,7,0,-1,4,2];●h=[2,3,0,-5,2,1];●y=conv(x,h);●%y=[6,31,47,6,-51,-5,41,18,-22,-3,8,2]●(共n+m-1项)●6、信号的相关●(1)两个序列x(n)和y(n)的相关可以看作是x(n)与y(-n)的卷积。

同理,信号x(n)的自相关即为x(n)与x(-n)的卷积。

●(2)xcorr(x)或xcorr(x,y)●例:t=1:5;●y=xcorr(t);●%y=[5,14,6,40,55,40,26,14,5]例:如下离散系统:●它有如下两种形式:●y=filter(b,a,x)●由上图可以知道:b=[0.2,0.1]●a=[1,-0.4,-0.5]●则系统的单位抽样响应为:h=filter(b,a,x)●(2)impz函数实现●Impz(b,a)可以直接得到单位抽样响应,并画出响应图形0.16●2、离散系统的频率响应●Matlab中的freqz函数用来计算由a,b构成系统的频率响应。

●[h,f]=freqz(b,a,n,fs)●例:●clc;●clear;●fs=1000;●b=[0.2 0.1];●a=[1 –0.4 –0.5];●[h,f]=freqz(b,a,256,fs);●mag=abs(h);●ph=angle(h);●ph=ph*180/pi;●figure;●plot(f,mag);●title(‘f-m’);●figure;●plot(f,ph);●title(‘f-p’);快速傅里叶变换在matlab中实现fft很简单,只需要通过命令fft来实现,这里需要注意的是采样频率不要太高,否则频谱的信息被掩盖。

另外,计算所得的序列中第k点所对应的实际频率为,f=k*fs/N,其中N为进行傅利叶变换的点数,fs为采样频率,一般取信号最大频率的3-5倍。

●例:●clc;●clear;●load leleccum;●x=leleccum;●N=length(x);●y=angle(fft(x));●fs=100;●f= (1:N)*fs/N;●plot(f,y);●●(1)巴特沃思数字滤波器的设计●[b,a]=butter(n,wn);●[b,a]=butter(n,wn,’ftype’);……●它得到的是一个阶数为n,截止频率为wn●的低通滤波器。

其中wn是指滤波器的半功率点,取值范围在0-1之间,取1时,为采样频率的一半,如果wn=[w1 w2]为两个元素的向量,函数返回的是阶数为2*n的带通滤波器,通带范围为w1-w2,其中ftype代表滤波器的形式,为high时,为高通滤波器,得到阶数为n,截止频率为wn的,高通滤波器。

为stop时,得到的是阶数为2*n,阻带为w1-w2的带阻滤波器。

●●例:采样频率为1000Hz的采样信号,设计一个10阶带通butter滤波器,通带范围为100-200Hz,并画出冲击响应曲线。

n=5;wn=[100 200]/500;[b,a]=butter(n,wn,’bandpass’);●[y,t]=impz(b,a,101);●stem(t,y);●例:●信号采样频率为1000Hz,设计一个阶数为9,截止频率为300Hz的高通巴特沃思滤波器。

●[b,a]=butter(9,300/500,‘high’);●Freqz(b,a,128,1000);●滤波器的幅频特性与相频特性如下:●(2)切比雪夫法设计滤波器●切比雪夫法设计滤波器可以分为切比雪夫1法和切比雪夫2法两种,这里我们只介绍切比雪夫1法。

●其语法结构为:●[b,a]=cheby1(n,Rp,wn);●[b,a]=cheby1(n,Rp,wn,’ftype’);●……●设计的是一个阶数为n,截止频率为wn,通带波纹衰减为Rp的低通滤波器。

返回值a,b分别是阶数为n+1的向量,表示滤波器系统函数的分母和分子的多项式系数,滤波器的传递函数可以表示为:函数的截止频率wn是指通带的边缘,在那滤波●例:●信号采样频率为1000Hz,设计一个阶数为9,截止频率为300Hz的低通切比雪夫滤波器,其中滤波器在通带的波纹为0.5dB。

●[b,a]=cheby1(9,0.5,300/500);●Freqz(b,a,512,1000);●滤波器的幅频特性与相频特性如下:例:采样频率为1000Hz的采样信号,设计一个10阶带通切比雪夫滤波器,通带范围为100-200Hz,滤波器在通带的波纹为0.5dB,并画出冲激响应曲线。

n=10;Rp=0.5;wn=[100,200]/500;[b,a]=cheby1(n,Rp,wn);[y,t]=impz(b,a,101);stem(t,y);冲激响应曲线如下:布莱克曼窗,海明窗,汉宁窗,以及矩形窗都是广义余弦窗的特殊情形。

这些窗可以看作是频率为0,2pi/(N-1)和4pi/(N-1)的余弦序列的线性组合。

N代表创的长度。

此类窗的生成方法如下:Ind=(0:n-1)’*2*pi/(n-1)W=A-B*cos(ind)+C*cos(2*ind)海明窗和汉宁窗是两项余弦窗,对海明窗:A=0.54,B=0.46,C=0对汉宁窗:A=0.5,B=0.5,C=0布莱克曼窗是三项余弦窗:A=0.42,B=0.5,C=0.08三种窗可通过以下三个函数实现:hamming,hanning,blackman使用中的一些技巧●1、数据的装入与存储●save;load;●2、子函数的编写●3、数据的保存与读取●4、路径设置●5、已有程序参考界面制作●参考书目:精通matlab综合辅导与指南●菜单●控制框●函数回调的考虑●指针和鼠标按钮事件●中断回调的规则●举例●对话框和请求程序菜单●主要包括建立菜单,建立子菜单,去除默认菜单,设置菜单回调函数●clear;●clc;●hf=figure;●%建立窗口并返回句柄hf●set(hf,'menubar','none')●%去除系统菜单●hm=uimenu(hf,'label','我的菜单');●hm_exgrid=uimenu(hm,'label','调用内联函数','callback','alnn')●%建立子菜单’调用回调函数’,并调用函数alnn(自己定义)●function alnn()●t=linspace(0,1,1024);●f=1;●x=sin(2*pi*f*t);●y=cos(2*pi*f*t)●z=x*y’;●surf(t,t,z);录制语音信号的程序●fs=11025;% 采样频率●duration=2;% 录音时间●fprintf(‘按任意键开始%g 秒录音:', duration); pause●fprintf(‘录音中...');●y=wavrecord(duration*fs, fs);% duration*fs 是录音资料点数●fprintf(‘录音结束\n');●fprintf(‘按任意键后开始播放:'); pause●wavplay(y,fs);设计实例1●1、建立一个*.m文件,实现信号发生功能(50Hz正弦)●2、对该信号进行FFT●3、将上述程序转化到子函数中●4、利用按钮调用这两个功能函数,并绘制图形输出●%signal1.m●%==============================●%产生一个频率为50Hz的正弦信号,取样时间t=0~0.2s,取样频率500Hz●clear;●clc;●t=linspace(0,0.2,100);●f=50●%fs=320●x=sin(2*pi*f*t);●plot(t,x);●sinwave=x;●save sinwave;●%==============================●%fftrans.m●%==============================●%提取刚才产生的sinwave信号,对其进行fft,已知信号采样频率500Hz●clear;●clc;●load sinwave●x=sinwave;●%fs=320●N=length(x);●y=abs(fft(x));●f=(1:N)*fs/N●plot(f,y);●%usefunction.m●%==============================●%编制子函数,产生制定频率,幅度,相位的正弦信号,取样时间t=0~0.2s,取样频率为信号频率的10倍●function y=usefunction1(A,f,fai)●fs=10*f;●t=linspace(0,0.2,0.2*fs);●x=A*sin(2*pi*f*t+fai);●plot(t,x);●sinwave_usefunction=x;●save sinwave_usefunction;●save fs;●%fft_usefunction.m●%==============================●function y=usefunction2(x,fs)●N=length(x);●y=abs(fft(x));●f=(1:N)*fs/N●plot(f,y);●fft_usefunction=y;●save fft_usefunction;●%sin_menu.m●%==============================●%建立一个菜单,其有两个子菜单,分别调用上述两个程序●clear;●clc;●hf=figure;●%建立窗口并返回句柄hf●set(hf,'menubar','none')●%去除系统菜单●hm=uimenu(hf,'label','我的菜单');●hm_exgrid=uimenu(hm,‘label’,‘正弦信号,'callback',‘usefunction1(2,50,0)')●load sinwave_usefunction●x= sinwave_usefunction●load fs hm_exgrid=uimenu(hm,'label',‘fft','callback','y=usefunction2(x,fs)')。

相关主题