【问题标题】:FIR filtering using window function: implementation problem使用窗口函数进行 FIR 滤波:实现问题
【发布时间】:2011-06-09 02:50:58
【问题描述】:

我想使用窗口函数制作 FIR 滤波器。我有一些样本数据,size 变量是样本数。 windowSize 变量是窗口函数的大小。 一开始我创建了窗口函数(blackman window):变量window 然后我需要将它乘以 sin(x) / x 函数并与真实数据(变量 data)进行卷积:

for (int i = 0; i < size; ++i) {
for (j = 0; j < windowSize; ++j) {
    double arg = 2.0 * PI * ((double)j - (double)windowSize / 2.0) / (double)windowSize;
    if (i + j - windowSize / 2 < 0)
       continue;
    if (arg == 0) {
    filteredData[i] += data[i + j - windowSize / 2] * window[j] * 1.0 /  (double)windowSize;
    } else
        filteredData[i] += data[i + j - windowSize / 2] * window[j] * (sin(arg) / arg) / (double)windowSize;
    }
}

问题:

  1. 因此,我得到一个过滤后的数据,其平均值与原始数据的平均值大不相同。哪里出错了?

  2. 在 DSP 书中写道,为了制作 FIR 滤波器,我们应该将函数 sin(x) / x 乘以窗口函数,然后执行卷积,但没有写任何关于 x em> 在 sin(x) / x,所以我使用了:

    double arg = 2.0 * PI * ((double)j - (double)windowSize / 2.0) / (double)windowSize;

对于x的值,sine的说法,对吗?

【问题讨论】:

    标签: c++ implementation signal-processing


    【解决方案1】:

    sin(x)/x 滤波器是一个低通滤波器。也就是说,它会抑制高于某个截止频率的所有频率。

    如果采样频率为Fs(赫兹)并且您希望截止频率为fc(赫兹),您应该使用x = 2*PI*fc/(2*Fs)*n,其中n-N变为+N和@ 987654328@ 足够大,以至于 sin(x)/x 函数接近于零。不要忘记当 x 为零时 sin(x)/x 为 1。

    要保持信号的平均值,您必须通过它们的总和对滤波器系数进行归一化。即,设置 f_norm[k] = f[k] / sum(f[k], k=...)

    这就是我现在要说的。看来你有很多东西要学。我推荐一本关于信号处理的好书。

    【讨论】:

      【解决方案2】:

      就实现而言,您似乎需要初始化filteredData[i],例如

      for (int i = 0; i < size; ++i) {
          filteredData[i] = 0;
          for (j = 0; j < windowSize; ++j) {
              ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多