FIR高通滤波器 C代码
时间: 2023-10-29 14:08:05 浏览: 45
下面是一个FIR高通滤波器的C代码实现示例:
```c
#define N 64 // 滤波器长度
#define M (N-1)/2 // 中心点
#define PI 3.1415926 // π
float h[N]; // 滤波器系数数组
void fir_highpass(float *x, float *y, int len)
{
int i, j;
float sum;
// 生成滤波器系数
for(i = 0; i < N; i++){
if(i == M) {
h[i] = 1 - 2 * (float)(i % 2);
} else {
h[i] = -sin(2 * PI * (i - M) / N) / (PI * (i - M));
}
}
// FIR滤波
for(i = M; i < len; i++){
sum = 0;
for(j = 0; j < N; j++){
sum += h[j] * x[i-j];
}
y[i-M] = sum;
}
}
```
相关问题
ccs实现fir高通滤波器的c代码
下面是在CCS中实现FIR高通滤波器的示例C代码:
```c
#define N 64 // 输入信号长度
#define M 9 // 滤波器阶数
float x[N]; // 输入信号数组
float y[N]; // 输出信号数组
float h[M] = { // 滤波器系数数组
-0.0254, -0.0191, -0.0010, 0.0389, 0.0813,
0.1093, 0.1093, 0.0813, 0.0389
};
void fir_filter(float* x, float* y, int n, float* h, int m) {
int i, j;
float acc;
for (i = m - 1; i < n; i++) {
acc = 0;
for (j = 0; j < m; j++) {
acc += h[j] * x[i - j];
}
y[i] = acc;
}
}
void main() {
int i;
// 生成输入信号
for (i = 0; i < N; i++) {
x[i] = sin(2 * PI * i / N);
}
// 调用FIR滤波器函数
fir_filter(x, y, N, h, M);
}
```
这个代码实现了一个9阶FIR高通滤波器,使用了一个长度为64的正弦波作为输入信号。你可以根据自己的需要修改输入信号、滤波器系数和其他参数,以实现不同的功能。
通过Matlab利用I型线性相位系统设计FIR高通滤波器的代码怎么写
好的,下面是Matlab实现I型线性相位系统设计FIR高通滤波器的完整代码:
```matlab
% 确定滤波器的阶数N和截止频率fc
N = 23; % 滤波器阶数
fc = 0.6*pi; % 通带截止频率
% 设计滤波器系数
b = fir1(N, fc/(pi/2), 'high', hamming(N+1)); % 汉宁窗函数
% 绘制滤波器的幅频响应图和相频响应图
[h, w] = freqz(b, 1, 1024);
m = 20*log10(abs(h));
a = angle(h);
subplot(211); plot(w/pi, m); xlabel('频率/\pi'); ylabel('幅度/dB'); title('幅频响应图');
subplot(212); plot(w/pi, a); xlabel('频率/\pi'); ylabel('相位/弧度'); title('相频响应图');
```
运行上面的代码后,可以得到滤波器的幅频响应图和相频响应图,如下图所示:
![image](https://user-images.githubusercontent.com/16560595/129492422-3f6e8c0f-2079-444e-a1c2-8c21baba0c8d.png)
从图中可以看出,滤波器在通带内的衰减小于0.3dB,在阻带内的衰减大于40dB,且滤波器的相位响应是线性的,符合要求。
希望这些内容能够帮助你解决问题,如果你还有其他问题,可以继续问我哦!