gpt4 book ai didi

c++ - 使用窗口函数 : implementation problem 进行 FIR 滤波

转载 作者:行者123 更新时间:2023-11-30 01:29:12 26 4
gpt4 key购买 nike

我想使用窗口函数制作一个 FIR 滤波器。我有一些样本数据,size 变量是样本数。 windowSize 变量是窗口函数的大小。首先我创建窗口函数(blackman 窗口):变量 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 乘以一个窗口函数,然后执行卷积,但是没有写关于 xsin(x)/x 中,所以我使用了:

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

对于x值,正弦的参数,是否正确?

最佳答案

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

如果采样频率是Fs(赫兹)并且你想要一个fc(赫兹)的截止频率,你应该使用x = 2*PI *fc/(2*Fs)*n 其中 n-N+NN 足够大,sin(x)/x 函数接近于零。不要忘记当 x 为零时 sin(x)/x 为 1。

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

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

关于c++ - 使用窗口函数 : implementation problem 进行 FIR 滤波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6287593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com