0

J'essaye de programmer un DSP (TMSF28335) en utilisant l'écriture de codes C dans Control Studio V6.02.Comment puis-je déplacer un signal de 90 degrés en utilisant un tampon circulaire

Dans ce projet, j'ai besoin de faire un déphasage de 90 degrés sur un signal AC que je mesure par les capteurs. On m'a conseillé d'utiliser un tampon circulaire afin de faire un tel déphasage. Mais malheureusement, je ne suis pas très familier comment écrire un tampon circulaire en langage C. Selon le concept, je sais que la "tête" du tampon doit être le signal d'entrée (signal AC mesuré) et la "queue" est le signal d'entrée décalé qui est utilisé comme signal de sortie du tampon circulaire.

La période d'échantillonnage du système est réglée sur 3.84599989e-5 (s) et une période sur 0.02 (s) (50 Hz). Donc 1/4 d'une période constitue (0,02/4) /3,84599989e-5=130 échantillons. Dans l'autre mot, j'ai besoin de faire un retard de 130 échantillons.

Je vous serais reconnaissant si vous pouvez me dire comment écrire le tampon circulaire en C pour mon contrôleur et en conséquence je peux faire un retard de phase.

+2

Recherchez un didacticiel sur les tampons circulaires. Apprenez à les mettre en œuvre et utilisez-les sur des exemples simples. Ensuite, découvrez la période exacte de votre signal. Ensuite, maintenez un quart de cela comme la distance entre l'entrée et la sortie. Alternativement (en cas de période non constante), vous devrez déterminer dynamiquement ce que signifie "90 degrés" pour votre signal à un moment donné. – Yunnosch

+1

Vous avez besoin d'un [filtre numérique] (https://en.wikipedia.org/wiki/Digital_filter) (soit FIR ou IIR) et de mettre en œuvre que vous devez utiliser un tampon circulaire qui est juste jusqu'à présent. J'utiliserais un filtre hilbert car cela transformerait 'cos (ωt)' en sin (ωt) 'qui est un décalage de 90 °. Voir: https://en.wikipedia.org/wiki/Hilbert_transform pour l'explication mathématique, vous avez besoin de connaissances sur les nombres complexes pour cela. Cette question devrait être mieux ici: https://dsp.stackexchange.com/. En outre, je recommanderais de former des choses telles que le traitement du signal numérique à Matlab. C'est génial pour ça! –

+1

Mais pour répondre à votre question sur les tampons circulaires c'est très général: https://stackoverflow.com/a/827749/8051589. Voici en un pour une implémentation de filtre FIR: https://stackoverflow.com/questions/22749058/circular-buffer-implementation-for-fir-filter-in-c. Il y a beaucoup de choses à trouver sur internet. –

Répondre

0

Ce dont vous avez besoin est une implémentation spéciale d'un tampon circulaire appelé ligne à retard. Voici une implémentation simple (rapide et sale, et quelque peu naïve). Notez que cela ne peut vous donner un déphasage fixe que si la fréquence d'entrée est constante.

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

Merci pour la réponse. J'ai essayé les codes dans CC6. Mon exemple de données est flottant. J'ai donc changé le type d'int pour flotter. L'erreur que j'ai reçue était sur les lignes "effect-> buffer [effect-> next] = sampleIn;" et "return effect-> buffer [nextOut]" en disant que "l'expression doit avoir le type entier ou enum". Pouvez-vous s'il vous plaît m'aider comment je dois réorganiser les codes de sorte que le signal d'entrée de la mémoire tampon (sampleIn) est accepté comme un fichier de type float? – Foad

+0

les indices 'next''nextOut' et' nextIn' sont des types 'int' quoiqu'il arrive. pour les échantillons flottants, il suffit de remplacer 'typedef Sample int' par' typedef Sample float' dans l'exemple ci-dessus. –

+0

Désolé, j'ai trouvé une erreur dans le code. Je l'ai corrigé. –