如何在 C 中实现 MATLAB 低通滤波器

How to implement a MATLAB lowpass filter in C

我设计了一块电路板,它使用 48kHz 的 16 位 DAC 对音频输入进行采样。它将数据存储为带符号的 16 位整数。我还在电路板上实现了一个 16 位 ADC,我能够成功地通过电路板传递音频。

我想用 MATLAB 设计一个低通滤波器并在这个板上实现。我了解如何使用 MATLAB 创建基本过滤器,但我不太了解如何弥合在 MATLAB 中创建过滤器与在我的板上使用 C 代码实现此过滤器之间的差距。我希望能够将信号传递到电路板并在 'real-time'.

中观察输出端的过滤信号

如何实现?

好的,你说你从 [B,A]= butter(..) likewise 滤波器中得到你的系数(尝试在 Z 域 AKA 数字滤波器中得到它们),那些 A,B 系数对应于一个简单的你知道的传递函数

H(z) = B(z)/A(z) = (b(1)+b(2) z^−1+⋯+b(n+1) z^−n)/(a(1)+a(2) z^−1+⋯+a(n+1) z^−n)

对吗?

你只需要记住输出 y = H(z)*x 或者换句话说

y = B(z)/A(z) * x and finally A(z)*y = b(z)*x

x(t) * z^-1 等于多少?是的 x(t-1)

这意味着您将以类似于以下的方式结束:

y(t)*a(1)+y(t-1)*a(2)+⋯+y(t-n)a(n+1) = x(t)*b(1)+x(t-1)*b(2)+⋯+x(t-n)b(n+1)

我们需要的是 y(t) 的实际值以及实际 x(t) 和过去 x(t-1) 等的已知值,以及过去 y(t) 的已知和存储值-1) 等...

y(t) = 1/a(1) * (x(t)*b(1)+x(t-1)*b(2)+⋯+x(t-n)b(n+1) - y(t-1)*a(2)-⋯-y(t-n)a(n+1))

这意味着您需要两个数组用于 x 和 y,并将方程与您从 matlab 获得的 B 和 A 数组一起应用...

遗憾的是,这假设您已经考虑了 butter() 中的采样时间(因此 Wn 应该被归一化)并确保您在准确的采样时间采集样本(并且理想情况下在准确的时间计算输出也是时间)