用c语言写一个低通滤波器
时间: 2023-06-09 22:03:04 浏览: 740
好的,这个问题其实很常见。在C语言中,可以使用数字信号处理(DSP)库来实现低通滤波器。下面是一个基本的代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
#define M_PI 3.14159265358979323846
/* 定义采样率和截止频率 */
#define Fs 8000
#define Fc 500
/* 定义数据类型 */
typedef double complex cplx;
/* 函数声明 */
void fft(int n, cplx *x, cplx *y);
void ifft(int n, cplx *x, cplx *y);
/* 主函数 */
int main(void)
{
/* 计算滤波器系数 */
double RC = 1.0/(2*M_PI*Fc);
double alpha = 1.0/(1.0 + RC*2*M_PI/Fs);
/* 定义数组 */
cplx sig[1024] = {0};
cplx filt[1024] = {0};
/* 填充数组 */
int i;
for(i = 0; i < 1024; i++)
{
sig[i] = 100*sin(2*M_PI*500*i/Fs);
}
/* 进行傅里叶变换 */
fft(1024, sig, filt);
/* 对频谱进行滤波处理 */
double T = 1.0/Fs;
for(i = 0; i < 1024; i++)
{
double f = i*Fs/1024.0;
double w = 2*M_PI*f;
double H = 1.0/sqrt(1.0 + pow((w/Fc), 2));
filt[i] = filt[i]*H*alpha;
}
/* 进行傅里叶逆变换 */
cplx out[1024] = {0};
ifft(1024, filt, out);
/* 输出滤波后的信号 */
printf("滤波后的信号:\n");
for(i = 0; i < 1024; i++)
{
printf("%.2f\n", creal(out[i]));
}
return 0;
}
/* 快速傅里叶变换 */
void fft(int n, cplx *x, cplx *y)
{
/* 判断是否为2的幂级数,并抛出异常 */
if(n <= 1) return;
if(n & (n - 1)) exit(1);
cplx even[n/2], odd[n/2];
int i;
for(i = 0; i < n/2; i++)
{
even[i] = x[i*2];
odd[i] = x[i*2 + 1];
}
fft(n/2, even, even);
fft(n/2, odd, odd);
for(i = 0; i < n/2; i++)
{
cplx t = cexp(-2*M_PI*I*i/n)*odd[i];
y[i] = even[i] + t;
y[i + n/2] = even[i] - t;
}
}
/* 快速傅里叶逆变换 */
void ifft(int n, cplx *x, cplx *y)
{
/* 对x数组取共轭 */
int i;
for(i = 0; i < n; i++)
{
x[i] = conj(x[i]);
}
/* 进行FFT变换 */
fft(n, x, y);
/* 对y数组取共轭 */
for(i = 0; i < n; i++)
{
y[i] = conj(y[i]);
}
/* 对y数组进行缩放 */
for(i = 0; i < n; i++)
{
y[i] = y[i]/n;
}
}
```
希望这个代码示例能够对你有所帮助!
阅读全文