c++实现巴特沃斯带通滤波器代码
时间: 2023-08-31 14:31:05 浏览: 129
### 回答1:
巴特沃斯带通滤波器是一种常见的数字信号处理滤波器,可以用于滤除某些频率范围内的干扰信号,保留感兴趣的信号。下面是一个简单的用C语言实现的巴特沃斯带通滤波器代码:
```c
#include <stdio.h>
#include <math.h>
#define N 4 // 滤波器阶数
#define fs 1000 // 采样频率
#define f1 100 // 通带下限频率
#define f2 200 // 通带上限频率
#define wp1 2 * M_PI * f1 / fs // 规范化通带下限频率
#define wp2 2 * M_PI * f2 / fs // 规范化通带上限频率
double a[N+1] = {1.0, -3.418, 4.315, -2.337, 0.4402}; // 巴特沃斯带通滤波器系数a
double b[N+1] = {0.0105, 0, -0.042, 0, 0.063}; // 巴特沃斯带通滤波器系数b
double x[N+1] = {0}; // 输入序列
double y[N+1] = {0}; // 输出序列
int main()
{
double t = 0; // 当前时间
double dt = 1.0 / fs; // 采样时间间隔
double input = 0; // 输入信号
double output = 0; // 输出信号
// 生成一个正弦波作为输入信号
for(int i=0; i<1000; i++)
{
input = sin(2 * M_PI * 100 * t);
t += dt;
// 巴特沃斯带通滤波器处理
x[0] = input;
y[0] = b[0] * x[0];
for(int j=1; j<=N; j++)
{
y[0] += b[j] * x[j] - a[j] * y[j];
x[j] = x[j-1];
y[j] = y[j-1];
}
output = y[0];
printf("%lf\t%lf\n", t, output); // 输出时间和输出信号
}
return 0;
}
```
该代码中,我们使用巴特沃斯带通滤波器的一阶公式:
$$ H(z) = \frac{b_0 + b_1 z^{-1} + b_2 z^{-2}}{1 + a_1 z^{-1} + a_2 z^{-2}} $$
其中,$b_0, b_1, b_2$ 和 $a_1, a_2$ 是滤波器的系数,$z^{-1}$ 表示时序向后移动一个采样点。在实现中,我们使用了一个长度为 $N+1$ 的数组来存储输入序列和输出序列,以及一个长度为 $N+1$ 的数组来存储滤波器的系数。在每个采样点,我们将当前输入信号存储在输入序列的第一个位置,然后通过递推式计算输出信号,并将输出信号存储在输出序列的第一个位置。最后,我们输出当前时间和输出信号。
需要注意的是,在实际应用中,我们需要根据需要选择合适的滤波器阶数和通带频率范围,以达到最佳的滤波效果。
### 回答2:
巴特沃斯带通滤波器是一种常用的数字滤波器,用于滤除指定频率范围内的信号,并保留其他频率的信号。下面是一个使用C语言实现巴特沃斯带通滤波器的例子。
```c
#include <stdio.h>
#include <math.h>
#define SAMPLE_RATE 44100 // 采样率
#define NUM_SAMPLES 1024 // 输入信号的样本数
// 巴特沃斯带通滤波器参数
#define CUTOFF_LOW 1000 // 低频截止频率
#define CUTOFF_HIGH 5000 // 高频截止频率
#define ORDER 4 // 阶数
double butterworth_bandpass_filter(double input)
{
static double x[NUM_SAMPLES]; // 输入信号缓冲区
static double y[NUM_SAMPLES]; // 输出信号缓冲区
static double a[ORDER+1]; // IIR滤波器系数a
static double b[ORDER+1]; // IIR滤波器系数b
static int initialized = 0;
int i, j;
if (!initialized)
{
double w1 = 2 * M_PI * CUTOFF_LOW / SAMPLE_RATE;
double w2 = 2 * M_PI * CUTOFF_HIGH / SAMPLE_RATE;
double t1 = 1 / tan(w1/2);
double t2 = 1 / tan(w2/2);
double alpha = sin((w2 - w1) / 2) / cos((w2 + w1) / 2);
// 计算巴特沃斯滤波器系数
double a0 = (t2 - t1) / 2;
double a1 = (t2 + t1) * alpha;
double a2 = (t2 - t1) / 2;
double b0 = 1 + a1;
double b1 = -2 * cos((w2 + w1) / 2);
double b2 = 1 - a1;
// 归一化系数
double normalization = 1 / (1 + a1/a0 + a2/a0);
for (i = 0; i <= ORDER; i++)
{
a[i] *= normalization;
b[i] *= normalization;
}
initialized = 1;
}
// 移动输入和输出信号的缓冲区
for (i = NUM_SAMPLES - 1; i >= 1; i--)
{
x[i] = x[i-1];
y[i] = y[i-1];
}
// 输入新的样本
x[0] = input;
// 计算输出样本
y[0] = b[0] * x[0];
for (j = 1; j <= ORDER; j++)
{
y[0] += b[j] * x[j] - a[j] * y[j];
}
return y[0];
}
int main()
{
// 生成一个示例输入信号
double input_signal[NUM_SAMPLES];
for (int i = 0; i < NUM_SAMPLES; i++)
{
double t = (double)i / SAMPLE_RATE;
input_signal[i] = sin(2 * M_PI * 1000 * t) + sin(2 * M_PI * 5000 * t);
}
// 对输入信号进行滤波
double output_signal[NUM_SAMPLES];
for (int i = 0; i < NUM_SAMPLES; i++)
{
output_signal[i] = butterworth_bandpass_filter(input_signal[i]);
}
// 打印输出信号
for (int i = 0; i < NUM_SAMPLES; i++)
{
printf("%f\n", output_signal[i]);
}
return 0;
}
```
以上代码实现了一个巴特沃斯带通滤波器,将输入信号中位于1000Hz到5000Hz频率范围内的信号保留下来,而滤除其他频率的信号。我们通过main函数生成一个示例输入信号,然后对该信号进行滤波并打印滤波后的输出信号。可以根据需要修改代码中的输入信号和滤波器参数,以满足不同的应用需求。
### 回答3:
巴特沃斯带通滤波器是一种常用的数字信号处理滤波器,用于去除输入信号中指定频率范围之外的频率成分,而保留指定频率范围内的信号。下面是一个Python语言的巴特沃斯带通滤波器的代码示例:
```python
import numpy as np
from scipy.signal import butter, filtfilt
import matplotlib.pyplot as plt
# 生成原始信号
t = np.linspace(0, 1, 1000) # 时间范围从0到1,共1000个点
f = 50 # 原始信号频率
x = np.sin(2 * np.pi * f * t)
# 设计巴特沃斯带通滤波器
fs = 1000 # 采样频率
low_cut = 30 # 低截止频率
high_cut = 70 # 高截止频率
order = 4 # 滤波器阶数
nyquist = 0.5 * fs
low = low_cut / nyquist
high = high_cut / nyquist
b, a = butter(order, [low, high], btype='band')
# 应用滤波器
filtered_x = filtfilt(b, a, x)
# 绘制结果
plt.figure()
plt.subplot(2, 1, 1)
plt.plot(t, x)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.title('Original Signal')
plt.subplot(2, 1, 2)
plt.plot(t, filtered_x)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.title('Filtered Signal')
plt.tight_layout()
plt.show()
```
这段代码中,使用了NumPy库生成了一个频率为50的正弦波信号作为原始输入信号。接下来,使用`butter`函数设计了一个巴特沃斯带通滤波器,其中`low_cut`和`high_cut`分别表示滤波器的低截止频率和高截止频率,`order`表示滤波器的阶数。然后,通过`filtfilt`函数应用滤波器,得到滤波后的信号。最后,利用Matplotlib库绘制原始信号和滤波后的信号的时域波形图。
阅读全文