2011-12-30 2 views
0

J'ai écrit le code suivant pour la modulation de fréquence d'un signal audio. L'audio lui-même est de 1 seconde, échantillonné à 8000 Hz. Je veux appliquer FM à ce signal audio en utilisant une onde sinusoïdale avec une fréquence de 50 Hz (exprimée comme une fraction de la fréquence d'échantillonnage). Le signal de modulation a un indice de modulation de 0,25 de manière à créer une seule paire de bandes latérales.extrait de code de modulation de fréquence (FM)

for (i = 0; i < 7999; i++) { 
    phi_delta = 8000 - 8000 * (1 + 0.25 * sin(2* pi * mf * i)); 
    f_phi_accum += phi_delta; //this can have a negative value 
    /*keep only the integer part that'll be used as an index into the input array*/ 
    i_phi_accum = f_phi_accum; 
    /*keep only the fractional part that'll be used to interpolate between samples*/ 
    r_phi_accum = f_phi_accum - i_phi_accum; 
    //If I'm getting negative values should I convert them to positive 
    //r_phi_accum = fabs(f_phi_accum - i_phi_accum); 
    i_phi_accum = abs(i_phi_accum); 
    /*since i_phi_accum often exceeds 7999 I have to add this if statement so as to  prevent out of bounds errors */ 
    if (i_phi_accum < 7999) 
     output[i] = ((input[i_phi_accum] + input[i_phi_accum + 1])/2) * r_phi_accum;    
} 
+1

Ok, mais quelle est votre question? –

+0

Eh bien, ce code ne semble pas fonctionner et je ne suis même pas sûr si c'est supposé fonctionner. J'ai posé cette question dans un autre fil (http://stackoverflow.com/questions/8655121/frequency-modulation-fm) et j'ai simplement essayé de mettre en œuvre ce qu'on m'avait dit. –

Répondre

1

Votre calcul de phi_delta est désactivée par un facteur de 8000 et un décalage - il devrait être 1 +/- une faible valeur, à savoir

phi_delta = 1.0 + 0.25 * sin(2.0 * pi * mf * i)); 

qui se traduira par phi_delta ayant une gamme de 0,75 à 1,25.

+0

Ok, merci, je vais essayer et rapporter les résultats. Juste une question supplémentaire. Si je devais utiliser, disons, 2 au lieu de 0.25 pour l'indice de modulation, j'obtiendrais phi_delta dans une plage de -1 à 3. Il est donc possible que j'obtienne des valeurs négatives pour phi_accum (si phi_delta est négatif au début de la boucle). Maintenant, comment puis-je gérer cette situation? –

+0

En fait, oublie mon dernier commentaire. Je vais essayer d'abord –

+0

Normalement, la table de forme d'onde serait périodique et vous traiteriez les indices de la table de correspondance modulo de la taille de la table, c'est-à-dire que les indices devraient "s'enrouler". Votre audio échantillonné n'est probablement pas périodique mais vous pouvez toujours utiliser l'indexation modulo en première approximation pour l'instant. –