- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
与 IIR 滤波器系数相关的快速问题。这是我在网上找到的直接 II 型双二阶 IIR 处理器的一个非常典型的实现。
// b0, b1, b2, a1, a2 are filter coefficients
// m1, m2 are the memory locations
// dn is the de-denormal coeff (=1.0e-20f)
void processBiquad(const float* in, float* out, unsigned length)
{
for(unsigned i = 0; i < length; ++i)
{
register float w = in[i] - a1*m1 - a2*m2 + dn;
out[i] = b1*m1 + b2*m2 + b0*w;
m2 = m1; m1 = w;
}
dn = -dn;
}
我知道“寄存器”在某种程度上是不必要的,因为现代编译器对这种事情非常聪明。我的问题是,将滤波器系数存储在单个变量中而不是使用数组和取消引用值是否有任何潜在的性能优势?这个问题的答案是否取决于目标平台?
即
out[i] = b[1]*m[1] + b[2]*m[2] + b[0]*w;
对比
out[i] = b1*m1 + b2*m2 + b0*w;
最佳答案
这实际上取决于您的编译器和优化选项。这是我的看法:
register
。这只是对编译器的一个提示,现代编译器只是不使用它。编辑:好的,出于好奇,我编写了一个小程序,并在使用 VS2010 进行全面优化时生成了“相同”的代码。这是我在相关表达式的循环中得到的内容(两种情况完全相同):
0128138D fmul dword ptr [eax+0Ch]
01281390 faddp st(1),st
01281392 fld dword ptr [eax+10h]
01281395 fld dword ptr [w]
01281398 fld st(0)
0128139A fmulp st(2),st
0128139C fxch st(2)
0128139E faddp st(1),st
012813A0 fstp dword ptr [ecx+8]
请注意,我添加了几行来输出结果,以确保编译器不会优化掉所有内容。这是代码:
#include <iostream>
#include <iterator>
#include <algorithm>
class test1
{
float a1, a2, b0, b1, b2;
float dn;
float m1, m2;
public:
void processBiquad(const float* in, float* out, unsigned length)
{
for(unsigned i = 0; i < length; ++i)
{
float w = in[i] - a1*m1 - a2*m2 + dn;
out[i] = b1*m1 + b2*m2 + b0*w;
m2 = m1; m1 = w;
}
dn = -dn;
}
};
class test2
{
float a[2], b[3];
float dn;
float m1, m2;
public:
void processBiquad(const float* in, float* out, unsigned length)
{
for(unsigned i = 0; i < length; ++i)
{
float w = in[i] - a[0]*m1 - a[1]*m2 + dn;
out[i] = b[0]*m1 + b[1]*m2 + b[2]*w;
m2 = m1; m1 = w;
}
dn = -dn;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
test1 t1;
test2 t2;
float a[1000];
float b[1000];
t1.processBiquad(a, b, 1000);
t2.processBiquad(a, b, 1000);
std::copy(b, b+1000, std::ostream_iterator<float>(std::cout, " "));
return 0;
}
关于c++ - IIR滤波器的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9814067/
混响.m #define D 1000 OSStatus MusicPlayerCallback( void* inRefCon, AudioU
这与 this post 有关但它本身就是一个问题:在 40MHz 采样,我创建了一个窄带 IIR 滤波器,它的中心频率为 1MHz,带宽为 20kHz。这给出了以下系数 - Fc = 1e6 /40
我想在每个 1024 个样本的连续 block /时间帧上应用 FIR 或 IIR 滤波器(例如:低通滤波器)。 可能的应用: 实时音频处理,例如均衡器。在精确的时间,缓冲区中只有接下来的 1024
我正在尝试设计一个包含 IIR 滤波器功能的信号类。以下是我的代码: void signal::IIRFilter(vector coefA, vector coefB){ double ** tem
我实现了“IEEE 会刊”中的以下代码,N. Jeremy Kasdin(第 825 页)pdf .但我不明白这些行,因为我没有数字食谱书: /* perform the discrete Fouri
我正在尝试制作 IIR 滤波器。我做了FIR滤波器,但是我觉得IIR比FIR难。 我认为 IIR 与 FIR 类似,但它让我感到困惑。 我觉得过滤器是这样的 FIR : y(n) = b0(x[n])
对于图像处理算法,我通常使用相对较大的内核 fir 过滤器。使用简单的 IIR 滤波器进行低通滤波等是否有任何缺点?实现它们所需的资源较少,这看起来很有吸引力吗? 更新 1:我通常处理 10 或 12
我正尝试在 C 中为 FRDMKL25Z 实现 IIR 滤波器木板。我当前的代码如下所示: #include "Cpu.h" #include "Events.h" #include "ADC_1.h
我正在将当前使用 Apple 特定(加速)vDSP 函数 vDSP_deq22 的滤波器组移植到 Android(其中 Accelerate 不可用)。滤波器组是一组带通滤波器,每个带通滤波器返回各自
我有一个与 this post 直接相关的新问题- 在 Python 中构建,我有一个具有给定特性的二阶 IIR 带通滤波器 [以下代码是故意惯用的]: fs = 40e6 # 4
我是 DSP 的新手,我有一个关于信号过滤的问题。正如我在 Internet 上看到的,IIR 和 FIR 滤波器通常用于过滤信号。此外,我还看到了另一种过滤信号的方法,即:频域滤波器(如在 Aqui
我正在尝试实现 IIR 滤波器。 我试图实现以下过滤器,但 FIR : y(n) = b0(x[n]) + ... +bM-1(x[n-M+1]) IIR : y(n) = {b0(x[n]) + .
这个问题类似于https://dsp.stackexchange.com/questions/60694但我将其重新定义为 Python 实现问题,以便与我正在寻求的解决方案更加一致。 我想要实现一个
如何在我当前的 android 代码中实现 IIR 带通滤波器?我有一个 Android 应用程序可以记录音频(实际上是频率)并将其保存在 .wav 文件中。 我设法在网上找到了一个 IIR 滤波器库
您知道一些实现 IIR 滤波器的 C++ 库吗?我需要类似于 Matlab 的 filter(B,A,X) 函数的东西。虽然没有必要,但我更喜欢 IIR 直接形式 2 的实现。 最佳答案 有 Octa
我正在尝试使用 FFT 和逆 FFT (IFFT) 在 Matlab 中过滤(真实)信号。我有一个 IIR 滤波器(系数“b”和“a”)。我期待(大约?)与我简单执行此操作相同的结果: filtere
我正在尝试使用 FFT 和逆 FFT (IFFT) 在 Matlab 中过滤(真实)信号。我有一个 IIR 滤波器(系数“b”和“a”)。我期待(大约?)与我只是这样做的结果相同: filteredS
假设我们依次应用了 3 个过滤器: b, a = iirfilter(...) # or bilinear(...) or anything else producing b, a y = lfil
我正在尝试在 C# 中使用 IIR LP 滤波器。它是一个 5 阶巴特沃斯滤波器。该代码在 64 位模式下工作,但在 32 位模式下中断。调试显示,参数略有不同,输出增加到无穷大/NAN。我正在使用
给定一些数据x: from pandas_datareader.data import DataReader as dr x = np.squeeze(dr('DTWEXB', 'fred').dro
我是一名优秀的程序员,十分优秀!