c语言编写高阶数字滤波器的程序的代码示例
时间: 2024-03-06 14:51:39 浏览: 24
下面是一个使用C语言编写高阶数字滤波器的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* 定义滤波器的阶数 */
#define ORDER 2
/* 定义滤波器的截止频率 */
#define CUTOFF_FREQ 1000
/* 定义采样率 */
#define SAMPLE_RATE 44100
/* 定义滤波器的系数 */
float b[ORDER + 1] = {0.0};
float a[ORDER + 1] = {0.0};
/* 定义滤波器的状态 */
float x[ORDER + 1] = {0.0};
float y[ORDER + 1] = {0.0};
/* 计算滤波器的系数 */
void calc_coefficients()
{
float omega_c = 2.0 * M_PI * CUTOFF_FREQ / SAMPLE_RATE;
float alpha = sin(omega_c) / (2.0 * pow(2.0, 0.5) * pow(cos(omega_c), 0.5 - 1.0));
float beta = pow(1.0 + pow(2.0, 0.5) * alpha + pow(alpha, 2.0), 0.5);
/* 设置 b 系数 */
b[0] = alpha / beta;
b[1] = 0.0 - 2.0 * b[0];
b[2] = b[0];
/* 设置 a 系数 */
a[0] = 1.0;
a[1] = 0.0 - 2.0 * (pow(alpha, 2.0) - 1.0) / beta;
a[2] = (1.0 - pow(2.0, 0.5) * alpha + pow(alpha, 2.0)) / beta;
}
/* 处理一次采样 */
float process_sample(float input)
{
int i;
/* 计算输出 */
float output = 0.0;
for (i = 0; i <= ORDER; i++) {
output += b[i] * x[i] - a[i] * y[i];
}
/* 更新状态 */
for (i = ORDER; i >= 1; i--) {
x[i] = x[i - 1];
y[i] = y[i - 1];
}
x[0] = input;
y[0] = output;
return output;
}
int main()
{
/* 计算滤波器的系数 */
calc_coefficients();
/* 处理采样 */
float input, output;
while (1) {
scanf("%f", &input);
output = process_sample(input);
printf("%f\n", output);
}
return 0;
}
```
该程序使用一个二阶Butterworth滤波器进行数字滤波,可以通过修改 `ORDER` 和 `CUTOFF_FREQ` 来改变滤波器的阶数和截止频率。程序计算了滤波器的系数,并使用状态变量对输入信号进行滤波,并输出滤波后的信号。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)