要处理接收信号,用matlabR2022b设计了一个带通滤波器,但是在通带中增益竟然不为1,而且幅频很奇怪,如果把采样频率调小或者把过渡带调大就行,但是我要处理的信号,采集过来时的采样频率就时2GSa/s,这个是可以调小的吗?
% 获取凯塞窗参数,后续fir1要设计凯赛窗的带通滤波器
fs=2*10^9; % 采样频率(实际采集信号的采样率就是2GSa/s)
fc=[3.2 3.6 4.4 4.8]*10^6; %信号是4MHz,所以设计了这个通带(可调)
mag=[0 1 0]; %%[1 0]是低通,[0 1]高通,[0 1 0]带通,[1 0 1]带阻
dev=[0.01 0.05 0.01]; % 纹波
[n,wn,beta,ftype]=kaiserord(fc,mag,dev,fs);% 获取凯塞窗参数,根据过渡带幅值返回ftype类型
%设计凯赛窗带通滤波
h_kaiser=fir1(n,wn,ftype,kaiser(n+1,beta));
% 设计最优滤波器
fpm=[0 fc(1)*2/fs fc(2)*2/fs fc(3)*2/fs fc(4)*2/fs 1]; % firpm频段向量,归一化[0 1]
magpm=[0 0 1 1 0 0];
h_pm=firpm(n,fpm,magpm);
%幅值转db
m_kaiser=20*log(abs(fft(h_kaiser,1024)))/log(10);
m_pm=20*log(abs(fft(h_pm,1024)))/log(10);
% 设置幅频响应的横坐标为Hz,第k个点的实际频率为f(k)=k*fs/N,此处N=length(m_kaiser)。
%x_f=(0:length(m_kaiser)/2)*fs/length(m_kaiser); 因为用不了那么长,我把横坐标改小了
x_f=(0:length(m_kaiser)/10)*fs/length(m_kaiser);
% 只显示正频率部分
m1=m_kaiser(1:length(x_f));
m2=m_pm(1:length(x_f));
% 绘制幅频曲线
plot(x_f,m1,'-',x_f,m2,'-.');
xlabel('频率(Hz)');
ylabel('幅度(dB)');
legend('凯塞窗','最优滤波器');
grid;
不仅通带内增益不为1,而且也不平缓。(换成高通更离谱,高频也会降下去)
我看举的例子都没有采样频率和目标想要频率差这么大的,我这个4M/2G=0.002,是不是因为这个太小了?
如果把采样率调小,比如调成fs=2*10^7,这样结果就很好
但是这样的话,数字滤波器的采样频率和实际采样率就不一样了呀,能这么改吗?