数字滤波器:MATLAB常用函数

数字滤波器:MATLAB常用函数

数字滤波器的MATLAB与FPGA实现 Altera Verilog版 第2版
MATLAB预备函数知识

1 MATLAB常用的信号产生函数

  在进行数字信号处理仿真或设计时,经常需要产生随机信号、方波信号、锯齿波信号、正弦波信号,以及带有加性白噪声的某种输入信号。MATLAB提供了丰富的信号产生函数,用户直接调用即可。

  1) 随机信号产生函数
  MATLAB提供了两类随机信号产生函数——rand(1,N)和randn(1,N),其中rand()将产生长度为N的在[0,1]上均匀分布的随机序列; randn()将产生均值为0、方差为1的高斯随机序列,也就是功率为1W的白噪声序列。具有其他分布特性的序列可以由这两种随机信号产生函数变换产生。

  2) 方波信号产生函数
  MATLAB提供了方波信号产生函数square(). square()有 square(T)和square(T, DUTY)两种格式,前者对时间变量T产生周期为2T、幅值为±1的方波;后者产生指定占空比的方波,参数DUTY指定信号为正值的区域在一个周期内所占的比例,取值为0~100,当DUTY取 50时,产生方波信号,与square(T)函数完全相同。

  3) 锯齿波信号产生函数
  MATLAB提供的锯齿波信号产生函数sawtooth()也有sawtooth(T)和 sawtooth(T,WIDTH)两种格式,前者对时间变量T产生周期为2T、幅值为土1的锯齿波;后者对时间变量T产生三角波,参数WIDTH指定三角波的尺度值,取值为0~l,当WIDTH=0.5时产生对称的三角波信号,当WIDTH取1时产生锯齿波信号。

  4) 正弦波信号产生函数
  MATLAB提供了完整的三角函数,如正弦函数 sin()、双曲正弦函数sinh()、反正弦函数asin()、反双曲正弦函数 asinh()、余弦函数cos()、双曲余弦函数 cosh()、反余弦函数acos()、反双曲余弦函数acosh()、正切函数 tan()、余切函数cot()等,这几种函数的用法基本相同,如sin(T)函数将对时间变量T产生周期为2T、幅值为+1的正弦波信号。

举例为

%% 编写一个M文件,依次产生均匀分布的随机信号序列、高斯白噪声随机信号序列、方波信号序列、三角波信号序列、
% 正弦波信号序列,以及信噪比SNR为10dB的加性高斯白噪声正弦信号序列
%% 产生方波、三角波及正弦波序列波形
% 定义参数
Ps = 10;        %正弦波信号功率为10dBW
Pn = 1;			%噪声信号功率为0dBW
f = 100;		%信号的频率为1KHZ
Fs = 1000;		%抽样频率为1KHZ
width = 0.5;	%函数sawtooth()的尺度值为0.5
duty = 50;		%函数square()的占空比参数为50

%产生信号
t = 0:1/Fs:0.1;	%采样时长0.1s
c = 2*pi*f*t;	%f为信号频率
sq = square(c,duty);	%产生方波信号
tr = sawtooth(c,width);	%产生三角波信号
si = sin(c);			%产生正弦信号

%产生随机信号序列
noi = rand(1,length(t));	%产生均匀分布的随机信号序列
noise = randn(1,length(t));	%产生高斯白噪声信号序列

%产生带有加性高斯白噪声的正弦波信号序列
sin_noise = sqrt(2*Ps)*si + sqrt(Pn)*noise;  
sin_noise = sin_noise/max(abs(sin_noise));	%归一化处理

%画图
subplot(321);plot(t,noi);	axis([0 0.1 -1.1 1.1]);
xlabel('时间(s)','fontsize',8,'position',[0.08,-1.3,0]);ylabel('幅度(V)','fontsize',8);
title('均匀分布的随机信号序列','fontsize',8);

subplot(322);plot(t,noise);	axis([0 0.1 -max(abs(noise)) max(abs(noise))]);
xlabel('时间(s)','fontsize',8,'position',[0.08,-3.2,0]);ylabel('幅度(V)','fontsize',8);
title('高斯白噪声信号序列','fontsize',8);

subplot(323);plot(t,sq);	axis([0 0.1 -1.1 1.1]);
xlabel('时间(s)','fontsize',8,'position',[0.08,-1.3,0]);ylabel('幅度(V)','fontsize',8);
title('方波信号','fontsize',8);

subplot(324);plot(t,tr);	axis([0 0.1 -1.1 1.1]);
xlabel('时间(s)','fontsize',8,'position',[0.08,-1.3,0]);ylabel('幅度(V)','fontsize',8);
title('三角波信号','fontsize',8);

subplot(325);plot(t,si);	axis([0 0.1 -1.1 1.1]);
xlabel('时间(s)','fontsize',8,'position',[0.08,-1.3,0]);ylabel('幅度(V)','fontsize',8);
title('正弦波信号','fontsize',8);

subplot(326);plot(t,sin_noise);	axis([0 0.1 -1.1 1.1]);
xlabel('时间(s)','fontsize',8,'position',[0.08,-1.3,0]);ylabel('幅度(V)','fontsize',8);
title('SNR=10dB的加性高斯白噪声正弦波信号','fontsize',8);

运行结果为
数字滤波器:MATLAB常用函数_第1张图片

2 常用信号分析及处理函数

  • 滤波函数filter
    数字滤波器:MATLAB常用函数_第2张图片

  • 单位抽样响应函数impz()

      MATLAB提供了一个可以直接求取系统单位抽样响应的函数 impz()。impz()函数有两种用法: impz(b, a, p)及 h=impz(b, a, p),其中 b、a分别为系统函数向量,p为计算的数据点数,如不设置p值,则函数取默认点数进行计算,h为单位抽样响应结果数据。函数的前一种用法直接在MATLAB绘图界面上画出系统的单位抽样响应杆图(Stem)图形,后一种用法则将单位抽样响应结果存入变量h中,但不绘图。

  • 频率响应函数freqz()

      频率响应指系统的幅频(幅度-频率)响应及相频(相位-幅度)响应。频率响应是系统最基本最重要的特征,用户在设计系统时,通常以达到系统所需的频率响应为目标。对于一个给定的离散系统来说,MATLAB提供了freqz()函数来获取系统的频率响应。与impz()函数类似,freqz函数也有两种用法: freqz(b, a, n, Fs)及[h,f]=freqz(b, a, n, Fs),其中 b、a分别为系统函数向量;Fs为抽样频率; n为在[0 Fs/2]范围内计算的频率点数量,并将频率值存放在f中;h为存放频率响应计算结果。函数的第一种用法可直接绘出系统的幅频响应及相频响应曲线,第二种用法将频率响应结果存放在h及f变量中,但不绘图。

  • 零/极点增益函数

      对于一个离散系统来说,系统的零/极点及增益参数可以明确地反映系统的因果性、稳定性等重要特性,进行系统分析及设计时也常常会计算其零/极点和增益参数。用户可以使用MATLAB提供了root()函数来计算系统的零/极点及增益,也可以直接使用zplane()函数来画出系统的零/极点图。
    举例为

%% 分别用filter()和impz()函数获取指定离散系统(b=[0 0.5 0.3 0.2]),a=[1 0.2 0.4 -0.8])
% 的单位抽样响应;用freqz()函数获取系统的频率响应;分别用root()及zplane()函数获取系统
% 的零/极点图及增益

%%
L = 128;            %单位抽样响应序列的长度
Fs = 1000;          %抽样频率为1KHZ
b = [0.8 0.5 0.6];  %系统函数的分子系数向量
a = [1 0.2 0.4 -0.8];           %系统函数的分母系数向量
delta = [1 zeros(1,L-1)];       %生成长度为L的单位抽样响应序列  输入信号序列

FilterOut = filter(b,a,delta);  %filter函数获取单位抽样响应序列
ImpzOut = impz(b,a,L);          %impz函数获取单位抽样响应序列
[h,f] = freqz(b,a,L,Fs);        %freqz函数求频率响应
mag = 20*log(abs(h))/log(10);   %幅度转换成dB单位
ph = angle(h)*180/pi;           %相位值单位转化
zr = roots(b)                   %求系统的零点,并显示在命令行窗口
pk = roots(a)                   %求系统的极点,并显示在命令行窗口
g = b(1)/a(1)                   %求系统的增益,并显示在命令行窗口

%绘图
figure(1)
subplot(221);stem(FilterOut);
subplot(222);stem(ImpzOut);
subplot(223);plot(f,mag);
subplot(224);plot(f,ph);
figure(2)
freqz(b,a);                     %用freqz函数绘制系统频率响应
figure(3);          
zplane(b,a);                    %用zplane函数绘制系统零/极点图

结果为
数字滤波器:MATLAB常用函数_第3张图片

  • 快速傅里叶变换fft()和ifft()

      快速傅里叶变换"(Fast Fourier Transform,FFT)是1965年由库利和图基共同提出的一种快速计算DFT的方法,这种方法充分利用了DFT运算中的对称性和周期性,从而将DFT运算量从N(N为计算的数据点数)减少到NlogzN。当N比较小时,FFT优势并不明显;但当N大于32时,点数越大,FFT对运算量的改善就越明显,如当N=1024时,FFT的运算效率比 DFT提高了100倍。

      快速傅里叶变换在信号分析及处理中的使用十分广泛,MATLAB提供了fft()及 ifmt()两个函数,分别用于快速傅里叶正/反变换。函数最常用的用法是y=ffit(x,n),其中x是输入信号序列,n为参与计算的数据点数,y存放函数运算结果。当n大于输入序列的长度时,ft()函数在x的尾部补零构成n点数据;当n小于输入序列的长度时,fft()函数对序列x进行截尾。为提高运算速度,n通常取2的整数幂次方。

%% 产生频率为100HZ和105HZ正弦信号叠加后的信号,用fft()函数对信号进行频率分析,要求在频率上能分辨出
% 两种频率的正弦波信号,分别绘出信号的时域及频域波形
N = 512;                %数据长度
f1 = 100;               %信号频率,单位为HZ
f2 = 105;               %
Fs = 400;               %抽样频率,单位为HZ

t = 0:1/Fs:1/Fs*(N-1);  %产生时间序列 正好512个点
s = sin(2*pi*f1*t) + sin(2*pi*f2*t);         %产生两个频率信号的合成信号
f = fft(s,N);           %计算傅里叶变换
f = 20*log(abs(f))/log(10); %换算程dBW单位
ft = [0:(Fs/N):Fs/2];   %横坐标转换成以HZ为单位
f = f(1:length(ft));

%绘图
subplot(211);plot(t,s);
xlabel('时间(S)');ylabel('幅度(V)');title('时域信号波形');
subplot(212);plot(ft,f);
xlabel('频率(Hz)');ylabel('功率(dBW)');title('信号频谱图');

数字滤波器:MATLAB常用函数_第4张图片

3 滤波器设计分析工具FDATOOL

  FDATOOL (Filter Design & Analysis Tool)是MATLAB信号处理工具箱里专用的滤波器设计分析工具,MATLAB 6.0 以上的版本还专门增加了滤波器设计工具箱(Filter DesignToolbox)。FDATOOL可以设计包括FIR和IR的几乎所有常规滤波器,操作简单,使用方便灵活。

  FDATOOL的工作界面如图所示,总共分两大部分:一部分是Design Filter,在界面的下半部,用来设置滤波器的设计参数;另一部分则是特性区,在界面的上半部分,用来显示滤波器的各种特性。
数字滤波器:MATLAB常用函数_第5张图片

  Design Filter部分主要分为Response Type(响应类型)选项和 Design Method(设计方法)选项,其中 Response Type选项包括Lowpass(低通)、Highpass(高通)、Bandpass(带通)、Bandstop(带阻)和 Differentiator(特殊的)FIR 滤波器;Design Method选项包括IIR滤波器的 Butterworth (巴特沃思)法、Chebyshev type I(切比雪夫I型)法、Chebyshev type II(切比雪夫Ⅱ型)法、Elliptic(椭圆滤波器)法,以及FIR滤波器的Equiripple法、Least-Squares(最小均方)法、Window(窗函数)法。

  Filter Order(滤波器阶数)选项用于定义滤波器的阶数,包括Specify order(指定阶数)和 Minimum order (最小阶数)。在Specify order中填入所要设计的滤波器的阶数(对于n阶滤波器,Specify order=n-1);如果选中 Minimum order选项,MATLAB则根据所选择的滤波器类型自动使用最小阶数。

  Frenquency Specifications 选项可以详细定义频带的各种参数,包括抽样频率Fs和频带的截止频率,它的具体选项种类由Filter Type选项和 Design Method选项决定。例如,Bandpass(带通)滤波器需要定义Fstopl(阻带下限截止频率)、Fpass1(通带下限截止频率)、Fpass2(通带上限截止频率)、Fstop2(阻带上限截止频率);而 Lowpass(低通)滤波器只需要定义Fstop1、Fpass1。采用窗函数设计滤波器时,由于过渡带是由窗函数的类型和阶数所决定的,所以只需要定义通带截止频率,而不必定义阻带参数。

  Magnitude Specifications 选项可以定义幅值衰减的情况。例如,设计带通滤波器时,可以定义Wstop1(频率Fstop1l 处的幅值衰减)、Wpass(通带范围内的幅值衰减)、Wstop2(频率Fstop2处的幅值衰减)。当选取采用窗函数设计时,可定义Window Specifications选项,它包含了各种可选的窗函数。

你可能感兴趣的:(matlab,fpga开发,开发语言)