【问题标题】:How to implement a MATLAB lowpass filter in C [closed]如何在 C 中实现 MATLAB 低通滤波器 [关闭]
【发布时间】:2016-02-26 07:02:41
【问题描述】:

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

我想用 MATLAB 设计一个低通滤波器并在这个板上实现它。我了解如何使用 MATLAB 创建基本过滤器,但我不能完全掌握如何弥合在 MATLAB 中创建过滤器和在我的板上使用 C 代码实现此过滤器之间的差距。我希望能够将信号传递到电路板并“实时”观察输出上的滤波信号。

如何做到这一点?

【问题讨论】:

  • 通过编写 c 代码来做到这一点。你不能问这个!!!有很多方法可以做到这一点。
  • @iharob 你为什么不指出我正确的方向并告诉我可以实现这一目标的众多方法之一?
  • 首先,你的matlab过滤器是如何实现的?你能发布你使用的代码吗?
  • 你也试过研究看看其他人是怎么做的吗? kiritchatterjee.wordpress.com/2014/11/10/…
  • @Ryu 我可以使用诸如 butter() 之类的东西创建一个带有 B 和 A 系数向量的简单滤波器。我也尝试过使用过滤器生成器工具。当我使用过滤器构建器工具时,我最终得到了一个 Matlab 对象,我不确定如何处理这个对象。

标签: c matlab filtering lowpass-filter


【解决方案1】:

好的,您说您从 [B,A]= butter(..) 同样的过滤器中获得系数(尝试在 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)

这意味着您将以类似于以下内容的 ecuation 结束:

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 应该被标准化)并确保您在该确切的采样时间采样(并且理想情况下也可以在准确的时间计算您的输出)

【讨论】:

  • 所以如果我理解正确的话,我可以把这些 B 和 A 系数归一化为有符号的 16 位格式,然后我可以使用输入和输出的差分方程应用它们,存储以前的满足 x(tn) 和 y(tn) 等所需的输入和输出?
  • 对!但不要忘记两件事:您需要标准化输入、系数和输出,如果您的 ADC 为 1 Vpp 吐出有符号的 16 位,那么您很幸运,但大多数时候您也需要这样做。 (与您将提供给 DAC 的值相同)我建议您从 -1.0 到 1.0 的浮点值开始,在您明白之后,进行规范化以能够使用 16 位或 32 位定点数学(带整数)
  • 呃哦,别忘了,一旦你完成一次迭代,更新你的数组,让 x[0] 到 x[1] 但 x[1] 到 x[2] 等等...换句话说,“乘以 z”一切(转移到过去)
  • 最后这就是所谓的无限响应过滤器(IRF 过滤器),因为它使用输出 Y 的过去值来计算新输出......您也可以搜索有限响应过滤器(我认为 FRF 滤波器)只使用输入 X 的过去值(但它使用了很多)......也许阅读它们......
  • 是的,我已将 DAC 的输出设置为使用 C 代码签名的 16 位格式。我计划在每次迭代后移动数组。据我了解,IIR 滤波器会没问题,因为未来的一些样本只会在 48kHz 时增加一点延迟。
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2011-12-26
  • 2015-02-02
相关资源
最近更新 更多