0

我正嘗試使用Control Studio V6.02中的C代碼編寫DSP(TMSF28335)。如何使用循環緩衝區將信號移位90度

在這個項目中,我需要對傳感器測量的交流信號進行90度的相位偏移。我被建議使用循環緩衝區來實現這種相移。但不幸的是,我不太熟悉如何用C語言編寫循環緩衝區。根據這個概念,我知道緩衝器的「頭部」應該是輸入信號(被測量的交流信號),「尾部」是用作環形緩衝器輸出信號的移位輸入信號。

系統的採樣時間設置爲3.84599989e-5(s),一個週期爲0.02(s)(50 Hz)。因此,一個週期的1/4會構成(0.02/4)/3.84599989e-5=130個樣本。換句話說,我需要延遲130個樣本。

如果能告訴我如何在C中爲我的控制器編寫循環緩衝區並相應地可以使相位延遲,我將不勝感激。

+2

查找有關循環緩衝區的教程。學習通過簡單的例子來實現和使用它們。然後找出你的信號的確切時間。然後保持輸入和輸出之間距離的四分之一。或者(如果是非恆定週期),您必須在任何給定時間動態確定「90度」對於您的信號的含義。 – Yunnosch

+1

您需要一個[數字濾波器](https://en.wikipedia.org/wiki/Digital_filter)(FIR或IIR)並實現您應該使用目前爲止正確的環形緩衝區。我將使用希爾伯特濾波器,因爲這會將'cos(ωt)'轉換爲90°位移的'sin(ωt)'。有關數學解釋,請參閱:https://en.wikipedia.org/wiki/Hilbert_transform,您需要了解有關複數的知識。這個問題應該在這裏更好:https://dsp.stackexchange.com/。此外,我會建議在Matlab中進行數字信號處理等方面的培訓。這對於這個目的很好! –

+1

但要回答關於循環緩衝區的問題,這是一個非常普遍的問題:https://stackoverflow.com/a/827749/8051589。這裏是一個FIR濾波器實現:https://stackoverflow.com/questions/22749058/circular-buffer-implementation-for-fir-filter-in-c。有很多東西可以在互聯網上找到。 –

回答

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]; 
} 
+0

感謝您的回覆。我嘗試了CC6中的代碼。我的示例數據是浮動的。所以我改變了int的類型來浮動。我收到的錯誤在行「效果 - >緩衝[效果 - >下一步] = sampleIn;」和「return effect-> buffer [nextOut]」,表示「表達式必須具有整數或枚舉類型」。你能幫我一下,我應該如何重新排列代碼,以便緩衝區的輸入信號(sampleIn)被接受爲浮點型文件? – Foad

+0

無論如何,next''nextOut'和'nextIn'都是'int'類型。對於浮點數樣本,您只需在上面的示例中將'typedef Sample int'更改爲'typedef Sample float'。 –

+0

對不起,我發現代碼中有錯誤。我糾正了它。 –