0

Control Studio V6.02でC言語コードを使用してDSP(TMSF28335)をプログラムしようとしています。循環バッファを使用して信号を90度シフトする方法

このプロジェクトでは、センサで測定するAC信号に90度の位相オフセットを付ける必要があります。私はこのような位相シフトを行うために循環バッファを使うことを勧められました。しかし残念ながら、C言語で循環バッファを書き込む方法はあまりよく分かりません。概念によると、私は、バッファの "頭"が入力信号(測定されたAC信号)でなければならないことを知っており、 "尾"は循環バッファの出力信号として使用されるシフト入力信号です。

システムのサンプリング時間は3.84599989e-5(s)に、1周期は0.02(s)(50Hz)に設定されています。 1周期の1/4は(0.02/4)/3.84599989e-5=130サンプルとなる。言い換えれば、私は130サンプル遅らせる必要があります。

私のコントローラ用にCで循環バッファを書き込む方法を教えてもらえれば、私は位相遅延を行うことができますので、感謝します。

+2

循環バッファーに関するチュートリアルを検索してください。簡単な例で実装して使用する方法を学んでください。その後、信号の正確な周期を調べます。それから入力と出力の間の距離の1/4を維持します。あるいは(一定でない場合)、信号の "90度"の意味を動的に判断する必要があります。 – Yunnosch

+1

[デジタルフィルタ](https://en.wikipedia.org/wiki/Digital_filter)(FIRまたはIIRのいずれか)が必要です。実装するには、これまでのリングバッファを使用する必要があります。ヒルベルトフィルタを使うと、 'cos(ωt)'を 'sin(ωt)'に変換します。これは90度のシフトです。数学的な説明については、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-fil-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の型を浮動させるように変更しました。私が受け取ったエラーは、 "effect-> buffer [effect-> next] =" sampleIn; "という行にあります。と "return effect-> buffer [nextOut]"は、 "式は整数型または列挙型でなければならない"と言っています。バッファの入力信号(sampleIn)が浮動小数点型ファイルとして受け入れられるようにコードをどのように並べ替えるべきか私に助けてください。 – Foad

+0

インデックス 'next''nextOut'と' nextIn'は何があっても 'int'型です。 floatサンプルの場合は、上記の例で 'typedef Sample int'を' typedef Sample float'に変更するだけです。 –

+0

申し訳ありませんが、コードにエラーがあります。私はそれを修正しました。 –

関連する問題