matlab 设计的滤波系数在fpga 的verilog/vhdl 或者 c语言中应用后 与 matlab中的filter函数结果有误差原因详解

该博客探讨了在FPGA或C语言中实现IIR滤波器时,量化滤波系数对滤波结果的影响。通过对比MATLAB `filter` 函数与量化后的滤波效果,发现量化位数增加(例如从16位到32位)能显著减少与MATLAB实现的误差。文章提供了MATLAB代码示例,展示了不同量化位数下滤波器的性能差异。
摘要由CSDN通过智能技术生成

 matlab 设计好滤波系数a 和 b之后,在fpga或者c编程实现滤波器之前需要先量化滤波系数,然后带入以下差分方程,依据以下差分方程实现滤波功能,该差分方程 为matlab 的filter函数实现原理

fpga 或者 c语言实现滤波过程依据以上差分方程,但是越往后面会发现,滤波结果与matlab filter 函数实现的结果误差越大,造成这一原因的是滤波系数应用之前有一个量化过程,量化位数长短,对应用结果影响很大,32位量化要比16位量化结果好的多,如下为实验结果

附上matlab代码,大家共同学习:

 

 

 

 

close all; 
clc;
clear;

%% 输入信号
X = textread('b02_ltc2324_1us.txt',' %f');
X = X(1.3*10^7:1.4*10^7);
figure
plot(X,'-r','DisplayName','原始信号')
hold on

%% 低通滤波 截止频率10k 2阶iir
fs=1000000;
fc_lpf=10000;
wn_lpf=fc_lpf*2/fs;
N_iir = 2;
[b_iir,a_iir] = butter(N_iir,wn_lpf,'low');
X1=filter(b_iir,a_iir,X);
plot(X1,'-*g','DisplayName','依据filter 函数滤波效果 ')
hold on

%% 量化滤波器系数

ql = 16;

m= max( max(abs(a_iir),abs(b_iir)) ); % 系数归一化
qm = floor(log2(m/a_iir(1)));
if qm < log2(m/a_iir(1))
    qm = qm +1;
end
qm = 2^qm;
qa = round( a_iir/qm * (2^(ql - 1) - 1) ) % 16bit量化
qb = round( b_iir/qm * (2^(ql - 1) - 1) )

%% 模拟fpga滤波效果
y = zeros(length(X),1);
% 模拟matlab
for i = 1:length(X)
    if i==1 
        y(1) = X(1) * qb(1) /qa(1);
    elseif i==2  
        y(2) = (X(2) * qb(1) + X(1)*qb(2) - y(1)*qa(2)) /qa(1);
    elseif i >=3  
        y(i) = (  X(i) * qb(1) + X(i-1)*qb(2) + X(i-2)*qb(3) -  y(i-1)*qa(2) -  y(i-2)*qa(3) )/qa(1) ;
    end     
end
plot(y,'-b','DisplayName','依据差分公式滤波效果 ql = 16 ')
hold on

%% 量化滤波器系数

ql = 32;

m= max( max(abs(a_iir),abs(b_iir)) ); % 系数归一化
qm = floor(log2(m/a_iir(1)));
if qm < log2(m/a_iir(1))
    qm = qm +1;
end
qm = 2^qm;
qa = round( a_iir/qm * (2^(ql - 1) - 1) ) % 16bit量化
qb = round( b_iir/qm * (2^(ql - 1) - 1) )

%% 模拟fpga滤波效果
y = zeros(length(X),1);
% 模拟matlab
for i = 1:length(X)
    if i==1 
        y(1) = X(1) * qb(1) /qa(1);
    elseif i==2  
        y(2) = (X(2) * qb(1) + X(1)*qb(2) - y(1)*qa(2)) /qa(1);
    elseif i >=3  
        y(i) = (  X(i) * qb(1) + X(i-1)*qb(2) + X(i-2)*qb(3) -  y(i-1)*qa(2) -  y(i-2)*qa(3) )/qa(1) ;
    end     
end
plot(y,'-c','DisplayName','依据差分公式滤波效果ql = 32 ')
hold on




 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值