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

Ios vDSP_desamp FIR滤波器采样历史连续性,ios,signal-processing,accelerate-framework,vdsp,Ios,Signal Processing,Accelerate Framework,Vdsp,我正在尝试使用vDSP_desamp()例程对不断捕获的音频信号进行下采样。根据Accelerate框架文档,此例程执行FIR滤波和抽取 但是,我有一个冲突,因为API没有为循环缓冲区提供输入参数,据我所知,该参数是保存样本历史以执行FIR滤波所必需的。这让我相信,在每次函数调用期间,样本历史记录都会被重置,或者可能会应用与我所知道的不同的算法 不幸的是,该函数是一个完整的黑盒,没有给出如何执行滤波或如何确保信号连续性的提示 如果我用前一个缓冲区的最后N个样本(N是过滤器抽头的数量)填充每一帧,

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

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

不幸的是,该函数是一个完整的黑盒,没有给出如何执行滤波或如何确保信号连续性的提示

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


欢迎对
vDSP_desamp()
的内部进行任何提示。

为什么说该函数是一个完整的黑盒?显示了
vDSP_desamp(A、I、F、C、N、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\u desamp
的第一个参数传递给

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

memcpy(A+N*I, A, (Number - N*I) * sizeof *A);
然后将新数据放到[code>A[Number-N*I]
及更高的位置。(如果源和目标范围重叠,则需要使用
memmove
而不是
memcpy
,但这在vDSP_desamp中并不常见;通常连续调用共享的数据只占整个缓冲区的一小部分。)



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

为什么说函数是一个完整的黑盒?显示了
vDSP_desamp(A、I、F、C、N、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\u desamp
的第一个参数传递给

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

memcpy(A+N*I, A, (Number - N*I) * sizeof *A);
然后将新数据放到[code>A[Number-N*I]
及更高的位置。(如果源和目标范围重叠,则需要使用
memmove
而不是
memcpy
,但这在vDSP_desamp中并不常见;通常连续调用共享的数据只占整个缓冲区的一小部分。)



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

谢谢。你是对的。我不应该把它写成“完全的黑盒”,而是“算法不符合我对FIR滤波的有限理解”。根据我的经验,FIR滤波器需要
memcpy(A+N*I, A, (Number - N*I) * sizeof *A);