我正在尝试使用Control Studio V6.02中的C代码编程DSP(TMSF28335)。
在这个项目中,我需要在传感器测量的交流信号上产生90度的相位偏移。我被建议使用循环缓冲器来进行这种相移。但不幸的是,我不太熟悉如何用C语言编写循环缓冲区。根据这个概念,我知道缓冲器的“头部”应该是输入信号(测量的AC信号),“尾部”是用作循环缓冲器的输出信号的移位输入信号。
系统的采样时间设置为3.84599989e-5(s),一个周期为0.02(s)(50 Hz)。因此,一个周期的1/4构成(0.02 / 4)/3.84599989e-5=130个样本。换句话说,我需要延迟130个样本。
如果您能告诉我如何在C中为我的控制器写循环缓冲区,我将不胜感激,因此我可以进行相位延迟。
答案 0 :(得分:0)
您需要的是一个称为延迟线的循环缓冲区的特殊实现。这是一个简单(快速,肮脏,有点天真)的实现。
请注意,只有在输入频率恒定时,才能为您提供固定的相移。
typedef short Sample; // change to whatever your sample data is...
#define DELAY (130)
struct DelayLine // <- make sure you initialize the entire struct
{ // with zeroes before use !
Sample buffer[DELAY + 1];
int next;
};
Sample tick(DelayLine* effect, Sample sampleIn)
{
// call for each sample received, returns the signal after delay
int nextOut = effect->next + DELAY; // note that this delay could be anything
// shorter than the buffer size.
if (nextOut >= DELAY + 1) // <-- but not this one!!!
nextOut -= DELAY + 1;
effect->buffer[effect->next] = sampleIn;
if (++(effect->next) >= DELAY + 1)
effect->next = 0;
return effect->buffer[nextOut];
}