窗函数法设计FIR滤波器
902 字
5 分钟
窗函数法设计FIR滤波器

信号选取
设被采样信号连续时间函数为
f(t) = 2sin(2pif1t) + 10sin(2pif2t) + 5sin(2pif3t)
其中,
f1 = 100;
f2 = 400;
f3 = 800;
依据采样定理,设
fs = 2400;
Ts = 1/fs;
连续时间t和采样时间的关系可以表示为
t = n*Ts
其中n为序列的下标
取观察时间T = 0.1s;
使用matlab生成离散时间信号序列
% 被采样信号设为f(t) = 2*sin(2*pi*f1*t) + 10*sin(2*pi*f2*t) + 5*sin(2*pi*f3*t)f1 = 100;f2 = 400;f3 = 800;fs = 2400;Ts = 1/fs;% 观察时间T = 0.1;
% 序列索引n = 0:round(T/Ts);
% 连续时间t和采样时刻的关系t = n*Ts;
% 序列x = 2*sin(2*pi*f1*t) + 10*sin(2*pi*f2*t) + 5*sin(2*pi*f3*t);N = length(x);标准DFT函数
function X_w = DFT(x,N) for k = 0 : N - 1 S = 0; for n = 0 : N - 1 S = S + x(n+1) * exp(-1j*(2*pi*k*n/N)); end X_w(k+1) = S; % X_clean = round(real(X_w), 12) + 1i*round(imag(X_w), 12); endend观察信号的频谱
X_w = DFT(x, length(x));k = 0:length(X_w)-1;
% 绘图
figure;
subplot(2,1,1);stem(n, x, 'filled');xlabel('n');ylabel('x[n]');title('时域序列');grid on;
subplot(2,1,2);stem(k, abs(X_w), 'filled');xlabel('k');ylabel('|X[k]|');title('DFT幅度谱');grid on;可以得出:

现在的目标就是抑制频率为800hz的信号成分
可以设理想滤波器的通带截至频率为wp = 2 * pi * 500hz,阻带频率为ws = 2 * pi * 600hz
理想滤波器公式:

注意,公式中的角频率是不是Hz为单位,而是离散时间角频率,即rad/sample
连续时间信号
采样后:
所以:
因此不妨直接设
wp = wp = 2 * pi * 500 / fs
ws = 2 * pi * 600 / fs
则有截止频率
wc = (ws+wp) * 0.5;
如下matlab代码的理想滤波器实现
ws = 2*pi*500/fs;wp = 2*pi*600/fs;wc = (ws+wp) * 0.5;alpha = (N - 1) / 2;% 理想滤波器% hd = sin(wc * (n - alpha)) ./ (pi * (n - alpha));for m = 0 : N - 1 if (n(m + 1) - alpha) ~= 0 hd(m + 1) = sin(wc * (n(m + 1) - alpha)) / (pi * (n(m + 1) - alpha)); else hd(m + 1) = wc / pi; endend
(n(m + 1) - alpha) ~= 0表示公式中n - alpha不为0的时候,当n - alpha = 0时,可求得 hd = wc / pi选择窗函数—Hann 窗为例
% 窗函数w = 0.5 * (1 - cos(2*pi*n / (N - 1)));将理想滤波器与窗函数在时序相乘对理想滤波器进行截断,得到滤波器系数
% 滤波器h = hd .* w;查看滤波器的频域响应是否符合预期
Hw = DFT(h,length(h));wk = 0 : length(h) - 1;figure;
subplot(1,1,1);stem(wk, abs(Hw), 'filled');xlabel('wk');ylabel('|hw|');title('滤波器');grid on;
由于DFT的周期性质,因此DTF图像上后部分有一段重复的图像。
得到滤波后的信号
要得到滤波后的信号则直接将信号和滤波器进行卷积
x_f = conv(x, h); % 卷积之后长度会变化n_xf = 0 : length(x_f) - 1;注意卷积之后长度会变化,不再是N
再对滤波后的信号进行DTF分析
Xf_w = DTF(x_f, length(x_f));k_xf = 0 : length(Xf_w) - 1;最后绘制图像
figure;
subplot(3,1,1);stem(wk, abs(Hw), 'filled');xlabel('wk');ylabel('|hw|');title('滤波器');grid on;
subplot(3,1,2);stem(n_xf, x_f, 'filled');xlabel('n_xf');ylabel('x_f');title('滤波后信号');grid on;
subplot(3,1,3);stem(k_xf, abs(Xf_w), 'filled');xlabel('k_xf');ylabel('|Xf_w|');title('滤波后频谱');grid on;
由于群延迟的存在,因此滤波后的时域信号产生了延迟,在图像上表现为往后延迟了,前100+个采样点的值在0附近。
由:
可得群延迟:
因此所有通过的频率分量大约都延迟:
个采样点,滤波后波形整体向右移动。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
离散KF仿真
自动控制离散KF的预测、更新和贝叶斯推导,以及双质量块系统的Simulink仿真。
2
Docker 部署项目与容器管理:挂载卷、查看、启动、停止和重启
部署实践从构建镜像和创建容器开始,介绍 Docker 项目的卷挂载、容器查看、启动、停止、重启,以及使用 Docker Compose 管理项目的常用命令。
3
在树莓派 4B 上部署百度网盘 ARM64 图形客户端
实用工具记录将 baidunetdisk-arm64-vnc 部署到树莓派 4B 的完整过程,包括 Docker 安装、ARM64 镜像转运、端口冲突和 NTFS 下载盘兼容性处理。
4
Linux 下用 Alist 挂载百度网盘并下载文件
实用工具记录在 Alist 中配置百度网盘驱动、刷新令牌和下载策略的方法,并说明如何验证文件是否可以正常下载。
5
Ubuntu 下使用 Easy Effects 优化耳机听感
实用工具记录 Ubuntu 下使用 Easy Effects 调整立体声宽度、军鼓亮度,以及贝斯和大鼓低频的过程。
随机文章随机推荐














