gpt4 book ai didi

ios - vDSP_desamp FIR 滤波器采样历史连续性

转载 作者:行者123 更新时间:2023-12-01 17:55:08 30 4
gpt4 key购买 nike

我正在尝试使用 vDSP_desamp()例程对不断捕获的音频信号执行下采样。根据 Accelerate-framework 文档,此例程执行 FIR 滤波和抽取。

但是我有一个冲突,因为 API 没有为循环缓冲区提供输入参数,据我所知,需要保留样本历史记录以执行 FIR 过滤。这让我相信在每次函数调用期间都会重置样本历史记录,或者可能正在应用与我所知道的算法不同的算法。

不幸的是,该函数是一个完整的黑匣子,没有给出关于如何执行过滤或应如何确保信号连续性的提示。

你认为如果我用前一个缓冲区的最后 N 个样本(N 是滤波器抽头的数量)填充每一帧以获得滤波连续性就足够了吗? 我会在调用 vDSP_desamp() 后丢弃那些填充样本输出,但我想应该在处理填充样本后正确初始化样本历史记录行。

关于 vDSP_desamp() 内部的任何提示受欢迎的。

最佳答案

为什么说函数是一个完整的黑匣子呢? documentation显示了 vDSP_desamp(A, I, F, C, N, P) 的伪代码:

for (n = 0; n < N; ++n)
{
sum = 0;
for (p = 0; p < P; ++p)
sum += A[n*I+p] * F[p];
C[n] = sum;
}

您也可以查看 /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/vDSP.h在任何最新的 OS X 系统上获取几乎所有 vDSP 例程的信息。它以不同的形式显示相同的事物:
for (n = 0; n < N; ++n)
C[n] = sum(A[n*I+p] * F[p], 0 <= p < P);

由此可知,每个输出值 C[n]P 的函数来自 A[n*I + 0] 的输入值至 A[n*I + P-1] .假设您希望下一次调用中的第一个输出值以与当前调用相同的模式继续,只需考虑当前调用中的最后一个输出值(最后一个 n 将是 N-1 ,因此最后一个输出值将是 C[N-1] ) 而下一个值是什么, C[N] .此 C[N]将是从 A[N*I + 0] 开始的输入值的函数, 即 A[N*I] .

然后将其与第一个输出值匹配, C[0] ,在下一次通话中。 C[0]将是从 A[0*I + 0] 开始的输入值的函数, 即 A[0] .

因此,要使下一个调用从当前调用结束的地方继续,您需要从 A[N*I] 复制值。及以后到 A[0]超越。 (这假设您通过移动数组中的数据然后附加新数据来重用数组 A。您也可以通过将 A+N*I 作为第一个参数传递给 vDSP_desamp 来继续处理数据。)

要复制的值的数量将是您在 A 中的值的数量。之后(包括) A[N*I] .例如,如果您有 Number A 中的值, 您可以使用:
memcpy(A+N*I, A, (Number - N*I) * sizeof *A);

然后把新数据放在 A[Number - N*I]超越。 (如果源和目标范围重叠,您需要使用 memmove 而不是 memcpy ,但这对于 vDSP_desamp 来说是不寻常的;通常连续调用共享的数据是整个缓冲区的一小部分。)

注:伪代码表达了操作的基本数学。出于性能原因,vDSP 例程中的实际算法可能会有不同的安排。因此,实际结果可能存在与直接使用伪代码计算的值不同的舍入误差。

关于ios - vDSP_desamp FIR 滤波器采样历史连续性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19324836/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com