c++fir高通滤波器
时间: 2023-12-09 12:04:25 浏览: 35
以下是C++实现的FIR高通滤波器的代码和解释:
```c++
#define FILTER_LEN 5
float h[FILTER_LEN] = {-0.0625,-0.25,0.75,-0.25,-0.0625}; // 高通滤波器系数
float fDelayLine[FILTER_LEN] = {0,0,0,0,0}; // 延迟线
void FIR_HighPass_Filter(float xAdcInput, float &xResult) {
int i;
float ftemp;
ftemp = 0;
for(i = FILTER_LEN-1;i > 0;i--) {
fDelayLine[i] = fDelayLine[i-1];
ftemp += h[i]*fDelayLine[i];
}
fDelayLine[0] = (float)xAdcInput;
ftemp += fDelayLine[0]*h[0];
xResult = ftemp;
}
```
该代码中,`FILTER_LEN`表示滤波器的长度,`h`是高通滤波器的系数,`fDelayLine`是延迟线,`FIR_HighPass_Filter`是高通滤波器的函数。该函数的输入参数为`xAdcInput`,表示输入的信号,`xResult`表示输出的信号。函数中,首先将延迟线向右移动一位,然后将输入信号与滤波器系数相乘并求和,得到滤波器的输出信号。
相关问题
fir高通滤波器matlab程序
以下是一个FIR高通滤波器的MATLAB程序示例:
```MATLAB
% 设计一个FIR高通滤波器
% 采样率为1000 Hz,截止频率为50 Hz
Fs = 1000; % 采样率
fc = 50; % 截止频率
% 设计滤波器
N = 100; % 滤波器阶数
b = fir1(N, fc/(Fs/2), 'high'); % FIR高通滤波器系数
% 生成信号
t = linspace(0, 1, Fs); % 1秒钟的时间轴
f1 = 10; % 信号频率1
f2 = 100; % 信号频率2
x = sin(2*pi*f1*t) + 0.5*sin(2*pi*f2*t); % 信号
% 滤波
y = filter(b, 1, x);
% 绘制结果
subplot(2,1,1);
plot(t, x);
title('原始信号');
subplot(2,1,2);
plot(t, y);
title('滤波后的信号');
```
在上面的程序中,我们使用了MATLAB中的`fir1`函数来设计FIR高通滤波器。这个函数的第一个参数是滤波器阶数,第二个参数是截止频率(归一化到采样频率的一半),第三个参数是滤波器类型(这里选择了“high”表示高通滤波器)。我们还生成了一个包含两个频率分量的信号,并使用`filter`函数来应用我们设计的滤波器进行滤波。最后,我们绘制了原始信号和滤波后的信号。
FIR高通滤波器 C代码
下面是一个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;
}
}
```