数字信号处理(2)- 数字滤波器

数字滤波器

简介

数字滤波器是由数字乘法器、加法器和延时单元组成的一种算法或装置。数字滤波器的功能是对输入离散信号的数字代码进行运算处理,以达到改变信号频谱的目的。
在这里插入图片描述

数字滤波器的系统函数为:
在这里插入图片描述

其对应的差分方程为:(其中x(n)为系统输入,y(n)为系统的输出)
在这里插入图片描述

将H(z)公式中的z换为ejw,可以求得w在(0~π)区间的频域响应
使用MATLAB中的freqz函数可以直接绘制出数字滤波器的频域响应曲线。
在这里插入图片描述

数字滤波器包括有限长冲激响应(FIR)滤波器、无限长冲激响应(IIR)滤波器。FIR滤波器的a(1)=1,a(2)…a(N+1)都为0,FIR滤波器只对输入信号进行处理,因此具有稳定性;IIR滤波器由于引入了输出信号的反馈,因此存在不稳定性。

MATLAB程序

FIR滤波器在工程中更为常用,MATLAB程序演示FIR滤波器的设计。

clc
clear
close all
 
N=512;          % 信号长度
Fs=1e6;         % 采样频率
dt=1/Fs;        % 采样间隔
t=(0:N-1)*dt;   % 时间序列
F1=15e3;        % 信号频率1 /Hz
F2=50e3;        % 信号频率2 /Hz
xn=2*cos(2*pi*F1*t)+cos(2*pi*F2*t+0.5*pi+1);% 15kHz+50kHz
 
 
%% FIR滤波器设计
FilterLen = 128;          % 滤波器长度
FilterStep = FilterLen-1; % 滤波器阶数
 
FreqStart=10e3;% 低截止频率
FreqEnd  =20e3;% 高截止频率
w1 = FreqStart/Fs*2*pi;% 归一化
w2 = FreqEnd  /Fs*2*pi;% 归一化
 
window = ones(FilterLen,1);% 矩形窗
% window = hanning(FilterLen);% 汉宁窗
% window = blackman(FilterLen);% 布莱克曼窗
 
% hn = fir1(FilterStep,w2/pi,'low',window);  % 生成低通滤波器
% hn = fir1(FilterStep,w2/pi,'high',window); % 生成高通滤波器
hn = fir1(FilterStep,[w1/pi,w2/pi],'bandpass',window);% 生成带通滤波器
% hn = fir1(FilterStep,[w1/pi,w2/pi],'stop',window);    % 生成带阻滤波器
 
figure;
freqz(hn,1);% 绘制归一化的滤波器的特性曲线
 
figure;
subplot(3,2,3);
plot(hn,'o-');
xlabel('点数/n');
title('滤波器时域图');
 
subplot(3,2,1);
plot(t,xn);
xlabel('时间/s');
title('原始信号');
 
 
%% FFT分析原始信号
NN=512;% NN点DFT
XN=fft(xn,NN)/NN;% 计算signal的NN点快速傅里叶变换
f0=Fs/NN;       % 频率分辨率
f=(0:NN-1)*f0;  % 频率序列
fk=(0:NN-1);    % 谱线序列
A=abs(XN);      % 幅值序列
Phase=atan(-real(XN)./imag(XN))/pi*180;  % 相位序列
 
subplot(3,2,2);
plot(f(1:NN/2),A(1:NN/2));
xlabel('频率/Hz');ylabel('幅度');
title('原始信号频谱');
 
 
%% Filtering
% 方法1:
% yn = conv(xn,hn);% 对原始序列和滤波器序列求卷积得到滤波后的结果
% yn = yn(FilterLen/2:FilterLen/2+N-1);% 滤波结果是居中的数据
 
% 方法2:
% 矩阵法计算卷积
a = N;
b = FilterLen+N-1;
Hn = zeros(a,b);% 初始化一个a行b列的矩阵
for i=1:a
    for j=1:FilterLen
        Hn(i,j+i-1) = hn(j);
    end
end
yn=xn*Hn;
yn = yn(FilterLen/2:FilterLen/2+N-1);
 
subplot(3,2,5);
plot(t,yn);
xlabel('时间/s');
title('滤波器输出信号');
 
 
%% FFT分析输出信号
NN=512;% NN点DFT
XN=fft(yn,NN)/NN;% 计算signal的NN点快速傅里叶变换
f0=Fs/NN;       % 频率分辨率
f=(0:NN-1)*f0;  % 频率序列
fk=(0:NN-1);    % 谱线序列
A=abs(XN);      % 幅值序列
Phase=atan(-real(XN)./imag(XN))/pi*180;  % 相位序列
 
subplot(3,2,6);
plot(f(1:NN/2),A(1:NN/2));
xlabel('频率/Hz');ylabel('幅度');
title('输出信号频谱');
 
 
%% 滤波器参数存为txt文件
fid=fopen('hn.txt','w'); %需要改文件名称的地方
count=fprintf(fid,'%d\n',round(hn*65536)); %需要导出的数据名称
 
 


运行结果

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/meng1506789/article/details/112946208