// reference implementation of an FIR
template
static void reference (const NumericType* firCoefficients,
size_t numCoefficients,
const SampleType* input,
SampleType* output,
size_t n) noexcept
{
if (numCoefficients == 0)
{//输出清零
zeromem (output, sizeof (SampleType) * n);
return;
}
//分配内存
HeapBlock scratchBuffer (numCoefficients
#if JUCE_USE_SIMD
+ (SIMDRegister::SIMDRegisterSize / sizeof (SampleType))
#endif
);
#if JUCE_USE_SIMD
SampleType* buffer = reinterpret_cast
(SIMDRegister::getNextSIMDAlignedPtr
(reinterpret_cast (scratchBuffer.getData())));
#else
SampleType* buffer = scratchBuffer.getData();
#endif
//内存清零
zeromem (buffer, sizeof (SampleType) * numCoefficients);
for (size_t i = 0; i < n; ++i)
{
//滑动,将数据向右移动一个位置
for (size_t j = (numCoefficients - 1); j >= 1; --j)
buffer[j] = buffer[j-1];
buffer[0] = input[i];//最新采集的数据
SampleType sum (0);//累加和清零
//重新相加
for (size_t j = 0; j < numCoefficients; ++j)
sum += buffer[j] * firCoefficients[j];
output[i] = sum;//更新输出
}
}
分享标题:fir滤波器
本文地址:
http://cxhlcq.com/article/gssdih.html