0

Ich versuche, einen DSP (TMSF28335) mit Schreiben C-Codes in Control Studio V6.02 zu programmieren.Wie kann ich ein Signal um 90 Grad mit einem Ringpuffer verschieben

In diesem Projekt muss ich eine 90 Grad Phasenverschiebung auf ein AC-Signal, das ich von den Sensoren messen. Mir wurde geraten, einen kreisförmigen Puffer zu verwenden, um eine solche Phasenverschiebung zu erreichen. Aber ich bin leider nicht sehr vertraut mit dem Schreiben eines zirkulären Puffers in C-Sprache. Nach dem Konzept weiß ich, dass der "Kopf" des Puffers das Eingangssignal sein sollte (gemessenes AC-Signal) und der "Schwanz" das verschobene Eingangssignal ist, das als das Ausgangssignal des Ringpuffers verwendet wird.

Die Abtastzeit des Systems ist auf 3,84599989e-5 (s) eingestellt und eine Periode ist 0,02 (s) (50 Hz). So bildet 1/4 einer Periode (0,02/4)/3,84599989e-5 = 130 Proben. In dem anderen Wort muss ich 130 Proben Verzögerung machen.

Ich wäre dankbar, wenn Sie mir sagen können, wie man den zirkulären Puffer in C für meinen Controller schreibt und dementsprechend kann ich Phasenverzögerung machen.

+2

Finden Sie ein Tutorial über zirkuläre Puffer. Lernen Sie, sie anhand einfacher Beispiele zu implementieren und zu verwenden. Dann finde die genaue Zeit deines Signals heraus. Dann behalte ein Viertel davon als die Entfernung zwischen Eingabe und Ausgabe bei. Alternativ (im Fall einer nicht konstanten Periode) müssen Sie dynamisch bestimmen, was "90 Grad" für Ihr Signal zu einem bestimmten Zeitpunkt bedeutet. – Yunnosch

+1

Sie benötigen einen [digitalen Filter] (https://en.wikipedia.org/wiki/Digital_filter) (entweder FIR oder IIR) und um das zu implementieren, sollten Sie einen Ringpuffer verwenden, der soweit richtig ist. Ich würde ein Hilbert-Filter verwenden, da dies 'cos (ωt)' in 'sin (ωt)' umwandeln würde, was eine Verschiebung von 90 ° ist. Siehe: https://en.wikipedia.org/wiki/Hilbert_transform für die mathematische Erklärung, man benötigt dafür Kenntnisse über komplexe Zahlen. Diese Frage sollte hier besser sein: https://dsp.stackexchange.com/. Weiter würde ich empfehlen, Dinge wie digitale Signalverarbeitung in Matlab zu trainieren. Es ist großartig für diesen Zweck! –

+1

Aber um Ihre Frage zu runden Puffern zu beantworten, ist dies eine sehr allgemeine: https://stackoverflow.com/a/827749/8051589. Hier in einem für eine FIR-Filterimplementierung: https://stackoverflow.com/questions/22749058/circular-buffer-implementation-for-fir-filter-in-c. Es gibt viel Zeug im Internet zu finden. –

Antwort

0

Was Sie brauchen, ist eine spezielle Implementierung eines Ringspeichers namens eine Verzögerungsleitung. Hier ist eine einfache (schnell und schmutzig, und etwas naiv) Implementierung.

Beachten Sie, dass dies nur dann zu einer festen Phasenverschiebung führen kann, wenn die Eingangsfrequenz konstant ist.

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

Danke für die Antwort. Ich habe die Codes in CC6 ausprobiert. Meine Beispieldaten sind float. Also habe ich den Typ von int in float geändert. Der Fehler, den ich erhielt, war in den Zeilen "effect-> buffer [effect-> next] = sampleIn;" und "return effect-> buffer [nextOut]" besagt, dass "Ausdruck einen Integral- oder Enum-Typ haben muss". Kannst du mir bitte helfen, wie ich die Codes neu anordnen soll, damit das Eingangssignal des Puffers (sampleIn) als float-type-Datei akzeptiert wird? – Foad

+0

Die Indizes 'next'' nextOut' und 'nextIn' sind' int' Typen egal was. Für Float-Beispiele müssen Sie im obigen Beispiel nur die 'typedef Sample int' in' typedef Sample float' ändern. –

+0

Entschuldigung, ich habe einen Fehler im Code entdeckt. Ich habe es korrigiert. –

Verwandte Themen