带通FIR滤波器
bandpass FIR filter
我需要制作一个简单的带通音频滤波器。现在我使用了这个简单的C++类:http://www.cardinalpeak.com/blog/a-c-class-to-implement-low-pass-high-pass-and-band-pass-filters
它运行良好并切断了所需的条带。但是当我尝试以小步长更改上限或下限时,在某些极限值上,我听到错误的结果 - 频率衰减或偏移(不对应于电流限制)声音。
脉冲响应计算功能:
void Filter::designBPF()
{
int n;
float mm;
for(n = 0; n < m_num_taps; n++){
mm = n - (m_num_taps - 1.0) / 2.0;
if( mm == 0.0 ) m_taps[n] = (m_phi - m_lambda) / M_PI;
else m_taps[n] = ( sin( mm * m_phi ) -
sin( mm * m_lambda ) ) / (mm * M_PI);
}
return;
}
哪里
m_lambda = M_PI * Fl / (Fs/2);
m_phi = M_PI * Fu / (Fs/2);
Fs - 采样率 (44.100)Fl - 下限福 - 上限
和简单的过滤功能:
float Filter::do_sample(float data_sample)
{
int i;
float result;
if( m_error_flag != 0 ) return(0);
for(i = m_num_taps - 1; i >= 1; i--){
m_sr[i] = m_sr[i-1];
}
m_sr[0] = data_sample;
result = 0;
for(i = 0; i < m_num_taps; i++) result += m_sr[i] * m_taps[i];
return result;
}
我需要使用任何窗口函数(布莱克曼等)吗?如果是,我该怎么做?我试图增加我对布莱克曼窗口的冲动反应:
m_taps[n] *= 0.42 - 0.5 * cos(2.0 * M_PI * n / double(N - 1)) +
0.08 * cos(4.0 * M_PI * n / double(N - 1));
但结果是错误的。我需要规范化水龙头吗?
我发现了FIR滤波器的一个很好的免费实现:http://www.iowahills.com/A7ExampleCodePage.html
。此窗口FIR滤波器C代码分为两部分,第一部分是 计算矩形窗口的脉冲响应(低 通过、高通、带通或陷波)。然后是一扇窗户(凯撒、汉宁、 等)应用于脉冲响应。有几个窗口 选择...
y[i] = 波形[i] × (0.42659071 – 0.49656062cos(w) + 0.07684867cos(2w))
其中w = (2)i/n,n是波形中的元素数
试试这个,我从以下位置获取代码:http://zone.ni.com/reference/en-XX/help/370592P-01/digitizers/blackman_window/
我希望这有所帮助。
相关文章:
- C++ OpenCV 卡尔曼滤波器构造函数错误
- OpenCV的卡尔曼滤波器过渡矩阵如何处理时间(如t和t^2)进行运动预测?
- 如何使用中值滤波器算法去除胡椒噪声
- 用于检测特定频率的直接显示滤波器
- Opencv 平均滤波器提供的输出与 Matlab 平均滤波器不同
- 使用Kalman滤波器来filt噪声,而不会延迟OpenCV C
- 使用哪个 pcl 滤波器对点云进行下采样
- 按类型参数进行GTEST滤波器测试
- 卡尔曼滤波器 - 零预测点
- 将信号转换为梯形(梯形滤波器)
- 字符数组中的滤波器unicode字符
- 如何在C/C++中使用FFmpeg API覆盖滤波器
- 实现了用于滤波器设计的remez交换算法
- 如何在 VTK 中投射滤波器的输出,C++与 QT 一起使用?
- Gabor滤波器C (OPENCV):错误
- FIR滤波器在C++中使用MATLAB中的系数设计,滤波器没有给出正确的结果
- 带通FIR滤波器
- 带FFT卷积的低通FIR滤波器-重叠加法,原因和方式
- FIR滤波器在c++
- C++FIR噪声滤波器