数字滤波器,Java数学,

3 java math signal-processing

我需要你的帮助,谢谢你阅读我的问题!我目前正在编写一个将使用Direket Form 2 Transposed Filter的java Programm.我知道Matlab中的函数过滤器会做得很好,但我必须使用Java.所以有人知道你实现这个Direkt Form 2 Transposed,这个数学函数:

y(n)= b(1)*x(n)+ b(2)*x(n-1)+ ... + b(nb + 1)*x(n-nb) - a(2)*y(n-1) - ... - a(na + 1)*y(n-na)

在任何Programmm语言?所有这一切都有希望成为一个方向,所以我可以弄明白!也许有一个C Lib实现了一些matlab函数,就是任何东西.

谢谢你的时间

你的Elektro

跟进:

我尝试了几天来了解你的功能,但我做不到.

这是Matlab的功能:过滤器

http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/ref/filter.html&http://www.google.de/search?hl=de&q =过滤器+ MATLAB&btnG =谷歌-Suche&元=&水溶液= F&OQ =

我所知道的是我在matlab中使用这样的函数:

newArray = filter(1,LPC_Faktor,OldArray)

我所要做的就是实现过滤功能.

你能再次帮忙吗?

谢谢

电力币

Thi*_*hib 9

无论您使用何种语言,直接形式II转置结构都非常简单.

例如,在C中,它可能是这样的:

float myFilter( float u)
{
  static float[nb] x = {0,0,0,...,0);  // initialize x
  static float[na] y = {0,0,0,...,0);  // initialize y
  static float b1 = ....;  // put b(1) here
  static float[nb] b = {...,...,...,...,...}; // put b(2) to b(nb+1) here
  static float[na] a = {...,...,...,...,...}; // put a(2) to a(na+1) values here

  // initialization
  float sum = 0;
  int i=0;

  // compute the value
  for(i=0;i<nb;i++)
    sum += b[i]*x[i];
  for(i=0;i<na;i++)
    sum -= a[i]*y[i];
  sum += b1*u;

  // prepare the values for the next time
  for(i=1;i<nb;i++)
    x[i] = x[i-1];
  x[0] = u;
  for(i=1;i<na;i++)
    y[i] = y[i-1];
  y[0] = sum;

  // return the value
  return sum;
}
Run Code Online (Sandbox Code Playgroud)

我没有测试代码,但它就是这样的.

Direct Form II转换是实现FIR滤波器的最简单形式(数值上,特别是在定点中,它不是最好的,但它是需要较少操作的形式).

当然,可以有更好的实现(例如,使用循环数组).如果需要,我也可以提供.

编辑:我回答得太快了.您提供的算法

y(n) = b(1)x(n) + b(2)x(n-1) + ... + b(nb+1)x(n-nb) - a(2)y(n-1) - ... - a(na+1)*y(n-na)
Run Code Online (Sandbox Code Playgroud)

不是直接形式II,而是直接形式I.它需要存储na + nb值(n是过滤器的顺序),而直接形式II仅需要max(na,nb).用于Direct Form II的算法是

e(n) = u(n) - a(1)*e(n-1) - a(2)*e(n-2) - ... - a(na)*e(n-na)
y(n) = b(1)*e(n-1) + b(2)*e(n-2) + ... + b(nb)*e(n-nb)
Run Code Online (Sandbox Code Playgroud)

如果您需要此表格,请告诉我.