用ccs写一个40阶的梳妆滤波器,采样频率为8kHz,截至频率为2khz,产生一个输入信号为800Hz,1600Hz,1200Hz,滤去信号中800Hz,1600Hz的谐波信号,保留1200Hz的信号
时间: 2024-05-07 13:19:30 浏览: 133
梳妆滤波器matlab代码
这里给出基于TI CCS的40阶IIR梳妆滤波器的代码,使用双二阶直接型II结构实现:
```c
#include "DSP28x_Project.h"
#define N 40 // 滤波器阶数
#define Fs 8000.0 // 采样频率
#define Fc 2000.0 // 截至频率
#define f1 800.0 // 输入信号1频率
#define f2 1600.0 // 输入信号2频率
#define f3 1200.0 // 输入信号3频率
float b[3*N+1], a[3*N+1]; // 滤波器系数
float w[2*N+1]; // 保存滤波器状态
void init_comb_filter(float b[], float a[], int N, float Fs, float Fc)
{
float K = tanf(PI * Fc / Fs); // 从截止频率计算K
float a1 = -1.0;
float b0 = 1.0 / (1.0 + K);
float b1 = -K / (1.0 + K);
int i;
for (i = 0; i < N; i++) {
b[3*i] = 1.0; // 第i个二阶节b0
b[3*i+1] = b0; // 第i个二阶节b1
b[3*i+2] = b1; // 第i个二阶节b2
a[3*i] = 1.0; // 第i个二阶节a0
a[3*i+1] = a1; // 第i个二阶节a1
a[3*i+2] = 0.0; // 第i个二阶节a2
}
b[3*N] = 1.0; // 最后一个b0
a[3*N] = 1.0; // 最后一个a0
}
float comb_filter(float x, float b[], float a[], float w[], int N)
{
float y = 0.0;
int i;
for (i = 0; i < N; i++) {
// 直接型II结构实现
y = w[2*i] + b[3*i]*x;
w[2*i] = w[2*i+1] + b[3*i+1]*x - a[3*i+1]*y;
w[2*i+1] = b[3*i+2]*x - a[3*i+2]*y;
x = y;
}
return y;
}
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EINT;
ERTM;
// 初始化滤波器
init_comb_filter(b, a, N, Fs, Fc);
// 设置输入信号
float x1 = sinf(2*PI*f1/Fs);
float x2 = sinf(2*PI*f2/Fs);
float x3 = sinf(2*PI*f3/Fs);
// 运行滤波器
float y1 = comb_filter(x1, b, a, w, N);
float y2 = comb_filter(x2, b, a, w, N);
float y3 = comb_filter(x3, b, a, w, N);
// 输出滤波结果
printf("Input signal: %f, %f, %f\n", x1, x2, x3);
printf("Output signal: %f, %f, %f\n", y1, y2, y3);
}
```
需要注意的是,由于浮点数计算精度问题,滤波器可能无法完全滤除谐波信号,同时滤波器的实现也可能会给信号带来一定的延迟。针对这些问题需要进行实际测试和优化。
阅读全文