这个带通滤波器不怎么带通,增益也不对(matlab)

要处理接收信号,用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;

img

img

不仅通带内增益不为1,而且也不平缓。(换成高通更离谱,高频也会降下去)
我看举的例子都没有采样频率和目标想要频率差这么大的,我这个4M/2G=0.002,是不是因为这个太小了?
如果把采样率调小,比如调成fs=2*10^7,这样结果就很好

img

但是这样的话,数字滤波器的采样频率和实际采样率就不一样了呀,能这么改吗?

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7694237
  • 除此之外, 这篇博客: 【图像识别】基于BP神经网络实现手写体大写字母识别matlab代码中的 基于 Matlab 的手写字符识别系统由以下模块构成,包括图像预处理、字符有效区域检测、图像分割、样本库训练和测试字符识别,如图 1。其中,原始图像:由数码相机或其它扫描装置拍摄到的图像;图像预处理:对动态采集到的图像进行滤波、边界增强等处理以克服图像干扰;字符分割、归一化:利用梯度检测的字符定位、分割方法得到单个的字符,并将所有字符归一化为固定大小;样本数据库:利用前期采集的每个字母 80 个的手写字符为第 5 步的字符识别建立字符模板数据库;BP 学习机:根据样本数量和训练分类结果构建BP 学习机;字符识别:基于人工神经网络的 OCR 算法,通过特征对比或训练识别出相关的字符,得到最后的英文字符识别结果。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读: