如何使用循环缓冲区将信号移位90度

时间:2017-08-11 07:30:27

标签: c signal-processing circular-buffer texas-instruments timedelay

我正在尝试使用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中为我的控制器写循环缓冲区,我将不胜感激,因此我可以进行相位延迟。

1 个答案:

答案 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];
}