fir滤波器的最简单C语言实现

C代码:

/*
C语言实现FIR滤波器-时域暴力卷积方法
y(n) = E(m=0->N-1) x(m)*h(n-m);
p_input : 待滤波数据
p_output : 滤波输出数据
data_len : 数据长度
p_fir_para : h(t)参数
fir_para_len : h(t)长度
*/
void c_fir(float* p_input, float* p_output, uint16_t data_len, float* p_fir_para,uint16_t fir_para_len)
{
    memset(p_output, 0, sizeof(float) * data_len);  //输出清零

    for (uint16_t i = 0; i < data_len; i++)
    {
        if (i < fir_para_len)
        {
            for (uint16_t j = 0; j <= i; j++)
            {
                p_output[i] += p_fir_para[j] * p_input[i - j];
            }
        }
        else if(i >= fir_para_len)
        {
            for (uint16_t j = 0; j < fir_para_len; j++)
            {
                p_output[i] += p_fir_para[j] * p_input[i - j];  //卷积和
            }

        }
    }
}

matlab代码:

%滤波参数,这里只用简单的平均滤波器,具体的系统函数设计非一日之
  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FIR带通滤波器是一种数字滤波器,它可以通过消除低频和高频信号来提取中间频率信号,常用于音频处理、图像处理等领域。下面是一个简单C语言代码示例,演示如何实现FIR带通滤波器: ```c #include <stdio.h> #include <math.h> #define N_COEFFS 51 #define SAMPLING_RATE 8000 #define FREQ_LOW 500 #define FREQ_HIGH 1500 const float coeffs[N_COEFFS] = {0.000051, 0.000047, 0.000036, 0.000019, -0.000004, -0.000030, -0.000055, -0.000073, -0.000077, -0.000062, -0.000024, 0.000030, 0.000093, 0.000151, 0.000184, 0.000174, 0.000105, -0.000032, -0.000226, -0.000446, -0.000643, -0.000761, -0.000748, -0.000558, -0.000171, 0.000412, 0.001125, 0.001833, 0.002399, 0.002648, 0.002433, 0.001634, 0.000207, -0.002097, -0.004874, -0.007447, -0.009191, -0.009490, -0.007967, -0.004484, 0.000828, 0.006219, 0.011637, 0.016053, 0.018491, 0.018172, 0.014658, 0.007966, -0.003303, -0.017031, -0.030680, -0.041114}; float input_samples[] = {0.1, 0.3, 0.5, 0.7, 0.9}; float output_samples[5-N_COEFFS+1]; int main() { int i, j; for (i = N_COEFFS - 1; i < 5; i++) { float output = 0; for (j = 0; j < N_COEFFS; j++) { output += input_samples[i - j] * coeffs[j]; } output_samples[i - N_COEFFS + 1] = output; } for (i = 0; i < 5-N_COEFFS+1; i++) { printf("%f ", output_samples[i]); } return 0; } ``` 在这个示例中,我们定义了一个长度为51的FIR带通滤波器,采样率为8000Hz,通带频率为500-1500Hz。我们还定义了一个长度为5的输入信号数组input_samples和一个长度为1的输出信号数组output_samples。 在主函数中,我们通过两个嵌套的循环来计算每个输出信号样本。外层循环从第N_COEFFS个输入信号样本开始,内层循环计算该输入信号样本和它之前的N_COEFFS-1个输入信号样本与系数的乘积之和,得到输出信号样本。然后将输出信号样本存储到输出信号数组中。最后,我们打印输出信号数组中的所有元素。 需要注意的是,这个示例中定义的FIR滤波器系数是经过离线计算得到的。在实际应用中,我们需要根据需要设计并计算出FIR滤波器的系数。可以使用MATLAB等软件进行计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值