04_数字信号滤波Matlab代码_常见操作
1. 设计一个如下的例子:
信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,现设计一个低通滤波器,截止频率125Hz,采样320个数据,采用函数fir1进行设计(注意这个函数是基于窗口的方法设计FIR滤波,默认是hamming窗),滤波器阶数设置为28。
1) 原始信号及FIR低通滤波
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 fs = 1000; %采样频率 2 N = 320; %采样点数 3 n=0:N-1; 4 5 t = n/fs; %时间序列 6 f = n*fs/N; % 频率序列 7 8 % 50Hz和200Hz正弦波混合 输入信号 9 x = sin(2*pi*50*t) + sin(2*pi*200*t); 10 11 % 基于窗函数的fir滤波器设计 12 % 28阶 w = 2*pi*f/Fs w数字角频率 f模拟频率 Fs采样频率 13 b = fir1(28, 0.25); 14 % freqz(b, 1, 512); %显示滤波器 15 y = filter(b, 1, x); % 对输入信号进行滤波操作 16 17 % 显示结果图 18 subplot(211); 19 plot(t, x); 20 title("50Hz和200Hz正弦波混合输入波形") 21 22 subplot(212); 23 plot(t, y); 24 title('FIR-Lowpass滤波后的波形');
2) 基于FIR低通滤波的频域分析过程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 %**************************************************************************************** 2 % FIR低通滤波器设计 3 %*************************************************************************************** 4 % 5 fs = 1000; % 设置采样频率1K 6 N = 320; % 采样点数 7 n = 0:N-1; 8 9 t = n/fs; %时间序列 10 f = n*fs/N; %频率序列 11 12 x = sin(2*pi*50*t) + sin(2*pi*200*t); %50Hz和200Hz正弦波合成 13 14 subplot(221); 15 plot(t, x); %绘制信号Mix_Signal的波形 16 xlabel('时间'); 17 ylabel('幅值'); 18 title('原始信号'); 19 grid on; 20 21 subplot(222); 22 y = fft(x, N); %对信号 Mix_Signal做FFT 23 plot(f, abs(y)); 24 xlabel('频率/Hz'); 25 ylabel("振幅"); 26 title('原始信号FFT'); 27 grid on; 28 29 30 31 %基于窗函数的fir滤波器设计 28阶 w = 2*pi*f/Fs w数字角频率 f模拟频率 Fs采样频率 32 b = fir1(28, 0.25); %28阶FIR低通滤波器,截止频率125Hz 33 filter_data = filter(b, 1, x); % 对输入信号进行FIR滤波操作 34 35 y3=fft(filter_data, N); %经过FIR滤波器后得到的信号做FFT 36 subplot(223); 37 plot(f,abs(y3)); 38 xlabel('频率/Hz'); 39 ylabel('振幅'); 40 title('滤波后信号FFT'); 41 grid on; 42 43 44 [H, F] = freqz(b, 1, 512); %通过fir1设计的FIR系统的频率响应 45 subplot(224); 46 plot(F/pi, abs(H)); %绘制幅频响应 47 xlabel('归一化频率'); 48 title(['Order=',int2str(30)]); 49 grid on;
3.) 4种FIR滤波的幅频归一化图
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 % 4种滤波的幅频归一化图 2 % 低通 3 b1 = fir1(28, 0.25); %28阶FIR低通滤波器,截止频率125Hz 4 [H, F] = freqz(b, 1, 512); %通过fir1设计的FIR系统的频率响应 5 subplot(221); 6 plot(F/pi, abs(H)); %绘制幅频响应 7 xlabel('低通滤波器'); 8 title(['Order=',int2str(28)]); 9 grid on; 10 11 % 高通 12 b2=fir1(28, 125/500, 'high'); %获得滤波器系数,截止频率125Hz,高通滤波。 13 [H2, F2] = freqz(b2, 1, 512); %通过fir1设计的FIR系统的频率响应 14 subplot(222); 15 plot(F2/pi, abs(H2)); %绘制幅频响应 16 xlabel('高通滤波器'); 17 title(['Order=',int2str(28)]); 18 grid on; 19 20 % 带通 21 b3=fir1(28, [125/500 300/500]); %获得滤波器系数,截止频率125Hz和300Hz,带阻滤波。 22 [H3, F3] = freqz(b3, 1, 512); %通过fir1设计的FIR系统的频率响应 23 subplot(223); 24 plot(F3/pi, abs(H3)); %绘制幅频响应 25 xlabel('带通滤波器'); 26 title(['Order=',int2str(28)]); 27 grid on; 28 29 % 带阻 30 b3=fir1(28, [125/500 300/500], 'stop'); %获得滤波器系数,截止频率125Hz和300Hz,带阻滤波。 31 [H3, F3] = freqz(b3, 1, 512); %通过fir1设计的FIR系统的频率响应 32 subplot(224); 33 plot(F3/pi, abs(H3)); %绘制幅频响应 34 xlabel('带阻滤波器'); 35 title(['Order=',int2str(28)]); 36 grid on;
2. 脉冲信号显示及频谱分析
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 %******************************* 2 % 3 % 脉冲信号的频谱滤波 4 % 5 %******************************* 6 7 clc; 8 clear all; 9 x=0:200; %x轴范围 10 y=dirac(x-50); %x=50处有δ函数,即δ(x-50) 11 y=1.5*sign(y); %改变幅度 12 13 y_fft = fft(y, 201); 14 15 16 17 subplot(211); 18 plot(x, y); 19 20 xlabel('时间'); 21 ylabel('幅值'); 22 title("原始信号02"); 23 24 subplot(212); 25 plot(x, y_fft); 26 xlabel('频率Hz'); 27 ylabel('幅值'); 28 title("原始信号02的幅频图"); 29 30 % axis ([0 200 -2 2])
1 %**************************************************************************************** 2 % FIR低通滤波器设计 3 %*************************************************************************************** 4 % 5 fs = 1000; % 设置采样频率1K 6 N = 320; % 采样点数 7 n = 0:N-1; 8 9 t = n/fs; %时间序列 10 f = n*fs/N; %频率序列 11 12 x = sin(2*pi*50*t) + sin(2*pi*200*t); %50Hz和200Hz正弦波合成 13 14 subplot(221); 15 plot(t, x); %绘制信号Mix_Signal的波形 16 xlabel('时间'); 17 ylabel('幅值'); 18 title('原始信号'); 19 grid on; 20 21 subplot(222); 22 y = fft(x, N); %对信号 Mix_Signal做FFT 23 plot(f, abs(y)); 24 xlabel('频率/Hz'); 25 ylabel("振幅"); 26 title('原始信号FFT'); 27 grid on; 28 29 30 %基于窗函数的fir滤波器设计 28阶 w = 2*pi*f/Fs w数字角频率 f模拟频率 Fs采样频率 31 b = fir1(28, 0.25); %28阶FIR低通滤波器,截止频率125Hz 32 filter_data = filter(b, 1, x); % 对输入信号进行FIR滤波操作 33 34 y3=fft(filter_data, N); %经过FIR滤波器后得到的信号做FFT 35 subplot(223); 36 plot(f,abs(y3)); 37 xlabel('频率/Hz'); 38 ylabel('振幅'); 39 title('滤波后信号FFT'); 40 grid o