我目前使用的DSP板是Spectrum Digital的DSK6416,我在C中实现卷积算法,用预先记录的脉冲响应阵列对输入语音样本进行卷积。目标是对着麦克风讲话,并输出处理后的效果,这样我们听起来就像是在获得脉冲响应阵列的环境中说话。
我现在面临的挑战是实时进行卷积,并以8 kHz的速度跟上中断功能的输入和输出速度。
这是我脑力激荡的想法:
我当前效率低下的实现不起作用如下:
中断将停止卷积过程,输出索引,并以8 kHz或1 / 8kHz秒恢复卷积。
然而,完整的卷积迭代运行速度比1 / 8kHz秒慢得多。因此,当中断想要从输出数组输出数据时,数据尚未就绪。
我对快速流水线卷积算法的理想实现:
我们会在后台运行许多卷积过程,同时随着时间的推移输出完成的卷积过程。将有许多管道并行运行。
如果我使用流水线方法,我们需要在后台运行N = 10000个流水线进程......
现在我有了这个想法(至少我认为我做了,我可能错了),我不知道如何使用C编程语言在DSK板上实现它,因为C不支持面向对象。
以下是我们的C实现的伪代码:
#include <stdio.h>
#include "DSK6416_AIC23.h"
Uint32 fs=DSK6416_AIC23_FREQ_48KHZ; //set sampling rate
#define DSK6416_AIC23_INPUT_MIC 0x0015
#define DSK6416_AIC23_INPUT_LINE 0x0011
Uint16 inputsource=DSK6416_AIC23_INPUT_MIC; // select input
//input & output parameters declaration
#define MAX_SIZE 10000
Uint32 curr_input;
Int16 curr_input2;
short input[1];
short impulse[MAX_SIZE ];
short output[MAX_SIZE ];
Int16 curr_output;
//counters declaration
Uint32 a, b, c, d; //dip switch counters
int i, j, k; //convolution iterations
int x; //counter for initializing output;
interrupt void c_int11() //interrupt running at 8 kHz
{
//Reads Input
//Start new pipe
//Outputs output to speaker
}
void main()
{
//Read Impulse.txt into impulse array
comm_intr();
while(1)
{
if (DIP switch pressed)
{
//convolution here (our current inefficient convolution algorithm)
//Need to run multiple of the same process in the background in parallel.
for (int k = 0; k < MAX_SIZE; k++)
{
if (k==MAX_SIZE-1 && i == 0) // special condition overwriting element at i = MAX_SIZE -1
{
output[k] = (impulse[k]*input[0]);
}
else if (k+i < MAX_SIZE) // convolution from i to MAX_SIZE
{
output[k+i] += (impulse[k]*input[0]);
}
else if (k+i-MAX_SIZE != i-1) // convolution from 0 to i-2
{
output[k+i-MAX_SIZE] += (impulse[k]*input[0]);
}
else // overwrite element at i-1
{
output[i-1] = (impulse[k]*input[0]);
}
}
}
else //if DIP switch is not pressed
{
DSK6416_LED_off(0);
DSK6416_LED_off(1);
DSK6416_LED_off(2);
DSK6416_LED_off(3);
j = 0;
curr_output = input[1];
output_sample(curr_output); //outputs unprocessed dry voice
}
} //end of while
fclose(fp);
}
有没有办法在C代码中实现管道在硬件DSP板上编译,这样我们可以在后台同时运行多个卷积迭代?
我画了一些照片,但我是这个主板的新手,所以我无法发布图片。
如果您需要我的图片创意来帮助我帮助我,请告诉我。
非常感谢有关如何实现此代码的任何帮助!!
答案 0 :(得分:3)
您可能需要处理一些N个样本的数据。当一个块在DAC / ADC中断处理程序中进行I / O时,另一个正在main()中的某处处理。这里的主要内容是确保您处理一大块N个样本所花费的时间少于接收/传输N个样本。
以下是它的样子(每一步中的所有事情(步骤1除外)都是“并行”):
从第2步无限期重复。</ p>
此外,您可能希望在汇编中实现卷积以获得额外的速度。我会看一些TI应用笔记或什么不适用于实现。也许它也可以在某些图书馆中找到。
您也可以考虑通过Fast Fourier Transform
进行卷积。
答案 1 :(得分:0)
您的DSP每秒只有很多CPU周期可用。您需要分析算法以确定平均处理每个样本所需的CPU周期数。这需要小于样本之间的CPU周期数。如果您没有平均每个样本足够小的周期完成的算法,那么任何流水线操作或面向对象都无济于事。