概述
如题,本人设计一个带通滤波器,想计算得到滤波器在任意频点上的脉冲响应。有三种方法:1.利用freqz计算滤波器的频率响应;2.对滤波器系数进行FFT变换。上述两种方法得到的都是离散频点的脉冲响应,频率是固定的离散值,不能满足满足需求。3.计算滤波器的转移函数。方法3代码如下:
clc;
close all;
clear all;
NFFT = 2*8192; % FFT点数
fs = 1250; % Sample rate,采样速率
Ts =1/fs;
%% 50Hz带通滤波处理
f0 = 50;% Hz,带通中心频率
BW = 2*4; % 通带宽度
f_p1 = f0 - BW/2; %通带左边缘频率,模拟频率, p--pass
f_p2 = f0 + BW/2; %通带右边缘频率,模拟频率
deta1 = 1; % 通带峰值起伏最大值,dB
f_s1 = f_p1 - 2; %阻带左边缘频率,模拟频率, s--stop
f_s2 = f_p2 + 2; %阻带右边缘频率,模拟频率
delta2 = 40; % 阻带最小衰减,dB
fcuts = [f_s1,f_p1,f_p2,f_s2];
mags = [0,deta1,0];
devs = [0.01,0.1087,0.01];
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fs);
hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale'); % FIR带通滤波器系数
[H,f] = freqz(hh,1,NFFT,fs); % f是模拟频率,H是频率响应,|H|是幅值,angle(H)是相角(弧度)。
figure(1);
plot(f, 20*log10(abs(H)));legend('滤波器幅频响应');
%% 手动计算FIR滤波器的频率响应
% 目的是可以计算滤波器在任意频率上的响应
n = 0 : NFFT-1;
omeg = zeros(1,NFFT);
H2 = zeros(size(omeg));
for m = 1:NFFT
omeg(m) = n(m)*2*pi*fs/(NFFT);
for l = 1:length(hh)
temp = hh(l) * exp(-1j*omeg(m)*(l-1));
H2(m) = H2(m) + temp; %计算得到的滤波器频率响应
end
end
figure(2);
plot(f,20*log10(abs(H2))); % 幅频响应
运行结果来看,H2只有第一个元素与H是相同的,这显然是错误的,且频率omeg是f对应位置的取值的2倍,请各位大神解答一下,为什么会出现这样的错误?
Fig1.jpg
(25.61 KB, 下载次数: 1)
2017-3-28 09:40 上传
fig1
Fig2.jpg
(36.86 KB, 下载次数: 0)
2017-3-28 09:41 上传
fig2
最后
以上就是友好小蜜蜂为你收集整理的matlab模拟滤波器频率响应,怎样求FIR滤波器在任意频率上的频率响应?的全部内容,希望文章能够帮你解决matlab模拟滤波器频率响应,怎样求FIR滤波器在任意频率上的频率响应?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复