2

我正在尝试处理 android 中的心电图信号处理。我想实现简单的数字滤波器(低通、高通)

我有一个传递函数:

点击查看传递函数

这是我发现的:

维基百科 - 低通滤波器- 在这里看起来很容易。

for i from 1 to n
  y[i] := y[i-1] + α * (x[i] - y[i-1])

但是我想使用的传递函数没有任何内容。

我还发现了以下matlab代码

%% Low Pass Filter  H(z) = (1 - 2z^(-6) + z^(-12)) / (1 - 2z^(-1) + z^(-2))
b = [1 0 0 0 0 0 -2 0 0 0 0 0 1];
a = [1 -2 1];
h_l = filter(b,a,[1 zeros(1,12)]); 
ecg_l = conv (ecg ,h_l);

但是在java中没有像filterand这样的功能(或者我错过了一些东西)。conv

我也在stackoverflow上寻找答案。但我没有发现任何关于传递函数的信息。

那么有人可以帮助我吗?我只想继续我的项目。

4

1 回答 1

2

给定一个时域递归方程(例如您从维基百科引用的那个),使用以下属性可以相对容易地获得 z 域中的相应传递函数:

$$\begin{align} \mathcal Z\left{x[nk]\right} &= z^{-k} X(z) \tag{1}\ H(z) &= \frac{Y(z )}{X(z)} \tag{2}\end{align}$$

其中X(z)Y(z)分别是时域输入序列x和输出序列的 z 变换y。反过来,给定一个传递函数,它可以表示为 z 中多项式的比率,例如:

H(z) = \frac{\sum_{i=0}^N b_i z^{-i}}{1 + \sum_{i=1}^M a_i z^{-i}}

传递函数的递推方程可以写成:

y[n] = -\sum_{i=1}^M a_i y[ni] + \sum_{i=0}^N b_i x[ni]

当然有许多不同的方法可以实现这样的递推方程,但是遵循直接形式 II的简单滤波器实现将沿着以下路线:

// Implementation of an Infinite Impulse Response (IIR) filter
// with recurrence equation:
//   y[n] = -\sum_{i=1}^M a_i y[n-i] + \sum_{i=0}^N b_i x[n-i]
public class IIRFilter {

  public IIRFilter(float a_[], float b_[]) {
    // initialize memory elements
    int N = Math.max(a_.length, b_.length);
    memory = new float[N-1];
    for (int i = 0; i < memory.length; i++) {
      memory[i] = 0.0f;
    }
    // copy filter coefficients
    a = new float[N];
    int i = 0;
    for (; i < a_.length; i++) {
      a[i] = a_[i];
    }
    for (; i < N; i++) {
      a[i] = 0.0f;
    }
    b = new float[N];
    i = 0;
    for (; i < b_.length; i++) {
      b[i] = b_[i];
    }
    for (; i < N; i++) {
      b[i] = 0.0f;
    }
  }

  // Filter samples from input buffer, and store result in output buffer.
  // Implementation based on Direct Form II.
  // Works similar to matlab's "output = filter(b,a,input)" command
  public void process(float input[], float output[]) {
    for (int i = 0; i < input.length; i++) {
      float in  = input[i];
      float out = 0.0f;
      for (int j = memory.length-1; j >= 0; j--) {
        in  -= a[j+1] * memory[j];
        out += b[j+1] * memory[j];
      }
      out += b[0] * in;
      output[i] = out;
      // shift memory
      for (int j = memory.length-1; j > 0; j--) {
        memory[j] = memory[j - 1];
      }
      memory[0] = in;
    }
  }

  private float[] a;
  private float[] b;
  private float[] memory;
}

您可以使用它来实现您的特定传输功能,如下所示:

float   g = 1.0f/32.0f; // overall filter gain
float[] a = {1, -2, 1};
float[] b = {g, 0, 0, 0, 0, 0, -2*g, 0, 0, 0, 0, 0, g};
IIRFilter filter = new IIRFilter(a, b);

filter.process(input, output);

请注意,您也可以将分子和分母分解为 2多项式并获得级联的 2滤波器(称为双二阶滤波器)。

于 2015-12-29T14:40:41.527 回答