大家好、
在处理来自 rxBuf0、rxBuf1和 rxBuf2的数据块时、如何处理以前的样本? 我尝试在 mcaspPlaybk.c 演示的音频链中插入一个滤波器、但我不知道如何在每个数据块之间存储以前的样本。
我尝试使用滤波器抽头数填充温度缓冲器、但这不起作用。 请参见下图,其中我将以前的样本保存在较低的数组中。
谢谢、
Scott
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
在处理来自 rxBuf0、rxBuf1和 rxBuf2的数据块时、如何处理以前的样本? 我尝试在 mcaspPlaybk.c 演示的音频链中插入一个滤波器、但我不知道如何在每个数据块之间存储以前的样本。
我尝试使用滤波器抽头数填充温度缓冲器、但这不起作用。 请参见下图,其中我将以前的样本保存在较低的数组中。
谢谢、
Scott
Scott、
如果您的示例有三个接收缓冲区、那么请n`t 当当前缓冲区被填满时、您仍然有之前的缓冲区。 我是说
当缓冲器 rxbu2中填充新数据并且正在处理 Rxbuf 1时、您在 rxbuf0中仍有数据是否为n`t μ s? 或者您是说处理时间更长、因此您丢失了数据。 n`t 还不清楚为什么温度缓冲解决方案不能为您工作、就好像您制作了样本的副本、那么您应该能够使用 PRV 样本。 另一个要尝试的方法是将 rxbuf0、rxbuf1和 rxbuf2本身填充存储样本并将样本复制到填充区域所需的额外内存。 这样、即使使用新数据填充 rxbuf、填充区域仍将包含您需要处理的先前样本。
此致、
Rahul
n`t:我为您查找了参考实现、但没有找到。 有一个具有此功能的 FIR 滤波器示例、但这可能与您的用例不完全匹配。
您好、Rahul、
我想我正在做你建议的事情。 我将填充 rxBuf、数量等于 number_for_tuts -1以执行卷积。 我要将 PRV 样本复制到填充区域、然后在填充新的 rxbuf 时、应填充之前的样本。 以下是我的代码:
lastSentTxBuf =(lastSentTxBuf + 1)% NUM_BUF; /* **将采样数据复制到临时缓冲区中 * memcpy (tempBuffer、(void *) rxBufPtr[lastFullRxBuf]、AUDIO_BUF_SIZE); /* **de-Interleave rxBuf /将 char 转换为 short signed int * charToShortInt (tempBuffer、AUDIO_BUF_Size/8、singleChannelInt); /* **将先前的样本插入缓冲器的前面,以便为 FIR 滤波器做好准备 * for (i= 0;i < NUM_OF_COEFFS - 1;+I) singleChannelInt[i]= padBuffer[i]; /* **转换为 FIR 滤波器的浮点值 * intToFloat (singleChannelInt、AUDIO_BUF_SIZE /8、DSPInputSignal); /* **FIR 滤波器 * DSP_FLOAT (DSPInputSignal、CoeffsFilter、DSPOutputSignal、NUM_OF_COEFFS、AUDIO_BUF_SIZE / 8); /* **转换回 TxBuf 的 int * floatToInt (DSPOutputSignal、AUDIO_BUF_SIZE/8、tempBufferInt); /* **保存当前 N 个样本以进行下一卷积 * for (i= 0;i < NUM_OF_COEFFS - 1;+I) padBuffer[i]= singleChannelInt[AUDIO_BUF_SIZE /8 + i ]; /* **转换回 txBuf 的 char 和 interleave * shortToChar (tempBufferInt、AUDIO_BUF_SIZE / 8、tempTxBuf); memcpy (((void *) txBufPtr [lastSentTxBuf]、tempTxBuf、AUDIO_BUF_SIZE); /* **通过相应地设置 DMA 参数来发送缓冲区。 **此处要发送的缓冲区和样本数按原样传递 **参数。 这一点很重要、如果只是传输段 **将被使用。 * BufferTxDMAActivate (lastSentTxBuf、NUM_Samples_per_AUDIO_BUF、 (无符号短整型) parToSend、(无符号短整型) parToLink);
但我仍然看到缓冲器之间存在不连续性。 例如、16次抽头的快照、我在该快照中尝试将之前的 N 个样本插入缓冲区的开头。 但是、来自前一个缓冲器的最后一个样本与当前样本不一致。
谢谢、
Scott
感谢您的回答。 charToShortInt()函数确实采用偏移索引。 这是代码。 它开始填充数组、从系数数减一:
void charToShortInt (unsigned char input[]、int size、short signed int output[]){ int i=0; int indx=0; for (i=NUM_OF_COEFFS - 1;i< size + NUM_OF_COEFFS - 1;i++){ output[i]= input[indx+1]<< 8; output[i]|= input[indx+0]<< 0; indx += 8; } }
我在全局范围内定义了 NUM_OF_COEFFS。
不过、我认为您的成绩是正确的。 我需要在某种程度上将新数据与旧数据(之前的样本)同步。 我的问题似乎是当前的 rxBuf 正在填充新数据、但之前的 rxBuf 样本与其不匹配。 我不知道如何解决它。
我不明白三个 rxBuf 接收缓冲区如何与 txBuf 同步。 它们以循环方式填充、那么我如何用系数数量填充缓冲器?
谢谢、
Scott