gpt4 book ai didi

c - C 中的 FIR 滤波器?

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:33 26 4
gpt4 key购买 nike

我有一个用 C 语言实现 FIR 滤波器的家庭作业,我想知道您是否认为我理解正确。我认为解决问题的程序是:

#include <stdio.h>
float FIRfloats[5];
void floatFIR(float newsample)
{
int i;
float sum=0;

FIRfloats[0]=newsample*0.0299;
FIRfloats[1]=FIRfloats[2]*0.4701;
FIRfloats[2]=FIRfloats[3]*0.4701;
FIRfloats[3]=FIRfloats[4]*0.0299;

/* sum */
for(i=0;i<5;i++)
{
sum=sum+FIRfloats[i];
}
printf("Sum: %f\n", sum);
}

int main ()
{

float n=0.0f;
while (scanf("%f", &n) > 0)
{
floatFIR(n);
}
return 0;
}

规范是

Before a new sample xk arrives the old samples are shifted to the right and then each sample is scaled with a coefficient before the result yk, the total sum of all scaled samples, is calculated

系数应为 c0=0.0299、c1=0.4701、c2=0.4701、c3=0.0299。

您认为我正确地完成了作业吗?我认为这似乎太容易了,因此我想知道。

最佳答案

恐怕问题中提供的实现不会提供正确的结果。

在具有 4 个系数的 FIR(有限脉冲响应)滤波器中,输入序列 (x) 的输出序列 (y) 为:

y[t] = c0*x[t] + c1*x[t-1] + c2*x[t-2] + c3*x[t-3]

因此实现应该类似于:

/* add includes (stdio.h and whatever else you'll need...) */

float floatFIR(float inVal, float* x, float* coef, int len)
{
float y = 0.0;
for (int i = (len-1) ; i > 0 ; i--)
{
x[i] = x[i-1];
y = y + (coef[i] * x[i]);
}
x[0] = inVal;
y = y + (coef[0] * x[0]);
return y;
}

main(int argc, char** argv)
{
float coef[4] = {0.0299, 0.4701, 0.4701, 0.0299};
float x[4] = {0, 0, 0, 0}; /* or any other initial condition*/
float y;
float inVal;

while (scanf("%f", &inVal) > 0)
{
y = floatFIR(inVal, x, coef, 4);
}
return 0;

}

这会在同一个循环中进行移位和乘法运算(这不会影响结果 - 只是效率更高。)如果您想完全遵循规范,可以像这样更改 floatFir:

float floatFIR(float inVal, float* x, float* coef, int len)
{
float y = 0.0;
for (int i = (len-1) ; i > 0 ; i--)
{
x[i] = x[i-1];
}
x[0] = inVal;

for (int i = 0 ; i < len ; i++)
{
y = y + (coef[i] * x[i]);
}
return y;
}

关于c - C 中的 FIR 滤波器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19093294/

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