Je sais que je peux changer la fréquence par des nombres entiers en modifiant la variable Shift forte> mais comment puis-je modifier la fréquence exemple de code ci-dessous de la question Casser / diminuer la fréquence d'un signal à l'aide de FFT et IFFT dans MATLAB / OCTAVE fonctionne avec la modification de la variable PS: J'utilise octave 3.8.1, qui est comme Matlab et je sais que je pourrais changer la fréquence en ajustant la formule de la variable Voici une vidéo YouTube animée Exemple de ce que j'essaie d'obtenir quand j'utilise l'équation de test Ya = .5 * Sin (2 * pi * 1 * t) +. 2 * cos (2 * pi * 3 * t) et ce que j'essaie Pour se produire si j'ai varié la variable
3 Réponses :
L'interpolation à bande-limitée à l'aide d'un noyau d'interpolation de sinc endifé peut être utilisée pour modifier la fréquence d'échantillon par des ratios arbitraires. Modification de la vitesse d'échantillon modifie la teneur en fréquence du signal, par rapport à la fréquence d'échantillon, par rapport inverse. P>
Merci, mais je ne suis pas vraiment sûr de ce que vous voulez dire ou comment programmer votre réponse pour tester cela
Vous pouvez le faire à l'aide d'un filtre à retard fractionnaire.
Tout d'abord, rendons le code de code viatte en laissant Matlab gérer la symétrie conjuguée de la FFT. Il suffit de faire se débarrasser de mag1 code> et
phase1 code> aller à la fin. . . p>
mag2s code> et
phase2s code> complètement. Cela simplifie les lignes 37 et 38 à. . P>
shift = 5.5;
Nw = floor(shift);
shift_b = [zeros(1, Nw) 1];
shift_a = 1;
Nf = mod(shift,1);
alpha = -(Nf-1)/(Nf+1);
fract_b = [alpha 1];
fract_a = [1 alpha];
%// now filter as a cascade . . .
mag1s = filter(shift_b, shift_a, mag1);
mag1s = filter(fract_b, fract_a, mag1s);
Merci beaucoup pour votre aide. Vous avez la variable 'Shift' en deux endroits, l'une comme Shift = 5 et l'une comme Shift = 5.5 est aussi mal cloutée que vous avez aussi les variables fract_b et fract_a mais je ne peux pas voir où ils sont utilisés.
J'ai été plus explicite dans le dernier bloc de code. Regarde à nouveau maintenant
La modification arbitraire de la fréquence en utilisant FFT n'est généralement pas possible. La taille de la FFT limitera toujours les changements que vous pouvez obtenir, même si vous utilisez des filtres à retard de fraction. Essayez-la d'une onde sinusoïdale nue et utilisez un algorithme de détermination de fréquence précis. Vous verrez que cela ne fonctionne pas.
@Learnvst Le code semble avoir des problèmes, j'ai créé une vidéo de YouTube animée de ce qu'elle fait (la ligne bleue est ce que votre code fait) à youtu.be/qir_o8q2bqs et votre code de test peut être trouvé ici. Bit.ly/1P5ZQ35
ok donc la question que je comprends c'est "comment puis-je déplacer mon signal par une fréquence spécifique?"
Définissons d'abord FS qui est notre taux d'échantillon (c.-à-d. Échantillons par seconde). Nous recueillons un signal qui est N échantillons de long. Ensuite, le changement de fréquence entre échantillons dans le domaine Fourier est FS / N. Ainsi, prenant votre exemple de code FS est de 2 000 000 et n est de 2 000 000 000, de sorte que l'espace entre chaque échantillon est de 1Hz et le transfert de votre signal 5 échantillons se déplace de 5Hz. P>
Disons maintenant que nous voulons déplacer notre signal de 5,25Hz à la place. Eh bien, si notre signal était de 8 000 000 échantillons, l'espacement serait FS / N = 0,25Hz et nous modifierions nos échantillons de signal 11. Alors, comment obtenons-nous un signal d'échantillon de 8 000 000 d'un signal d'échantillon de 2 000 000? Juste zéro cad! Ajoutez littéralement les zéros jusqu'à 8 000 000 échantillons. Pourquoi cela fonctionne-t-il? Parce que vous êtes essentiellement en train de multiplier votre signal par une fenêtre rectangulaire équivalente à la convolution de fonction Sinc dans le domaine de fréquence. C'est un point important. En ajoutant des zéros supplémentaires, vous êtes interpolant dans le domaine de fréquence (vous n'avez plus d'informations de fréquence sur le signal que vous entrez simplement interpolant entre les points DTFT précédents). P>
Nous pouvons le faire à n'importe quelle résolution souhaitée, mais vous devrez éventuellement faire face au fait que les chiffres de systèmes numériques ne sont pas continus, donc je vous recommande de choisir simplement une tolérance acceptable. Disons que nous voulons être dans la zone de 0,01 de notre fréquence souhaitée. p>
alors permet d'atteindre le code réel. La plupart d'entre eux ne changent pas heureusement. p> Le signal final est un peu sur 4Hz, ce que nous attendons. Il existe une certaine distorsion visible de l'interpolation, mais qui doit être minimisée avec un signal plus long avec une représentation de domaine de fréquence étouffante. P> Maintenant que j'ai traversé tout cela, vous vous demandez peut-être s'il y a un moyen plus facile. Heureusement pour nous, il y a. Nous pouvons tirer parti de la transformation Hilbert et des propriétés de transformée de Fourier pour atteindre un décalage de fréquence sans jamais se soucier des niveaux fs ou de tolérance ou d'espacement des bacs. Nous savons que nous savons qu'un changement de temps entraîne une déphasage dans le domaine de Fourier. Le temps et la fréquence des puits sont duels afin qu'un décalage de fréquence entraîne une multiplication exponentielle complexe dans le domaine temporel. Nous ne voulons pas simplement faire un changement en vrac de toutes les fréquences, car cela gâchera notre symétrie dans un espace de Fourier menant à une série de temps complexe. Nous utilisons donc la transformation Hilbert pour obtenir le signal analytique composé uniquement des fréquences positives, décalage que, puis reconstruisent nos séries chronologiques en supposant une représentation de Fourier symétrique. p>
Le transfert de Hilbert ne fonctionne que si vous utilisez des vagues célibataires de péché ou des vagues COS célibataires, mais si je mets Fshift = 1 et ya = .5 * péché (2 * pi * 1 * t) +. 2 * COS (2 * pi * 3 * t); (Je me suis ajusté juste pour essayer de simuler ce que la vague d'importation audio peut ressembler à une vague d'importation audio) et il semble s'effondrer voir le lien avec une vidéo animée YouTube j'ai créée montrant ce qui se passe youtu.be/j5umrpzvnma et lien vers votre code je l'ai testé avec Bit.ly / 1lwapnc
@Rickt Qu'attendez-vous que cela fasse dans cette situation? Quand je l'ai regardé, le résultat avec Ya = .5 * Sin (2 * pi * 1 * t) +. 2 * Cos (2 * pi * 3 * t) où Fshift = 1, Yashift est exactement Yashift = 0.5 * Sin (2 * PI * 2 * T) +. 2 * COS (2 * PI * 4 * T). Vous avez déplacé votre signal entier par 1Hz.
Voici un exemple de vidéo YouTube animé de ce que j'essaie d'obtenir quand j'utilise l'équation de test Ya = .5 * Sin (2 * pi * 1 * t) +. 2 * COS (2 * pi * 3 * t) et Ce que j'essaie de se produire si j'ai varié Fshift de (0: 0.1: 5) YouTu.be/pf25gw6is1u Veuillez garder à l'esprit que vous serez un signal audio importé, donc je n'aurai pas d'équation pour ajuster facilement
Je ne suis pas sûr de ce que vous demandez. Le décalage de fréquence en déplaçant ce signal est déjà (probablement) un non-entiers. L'espacement entre des échantillons dans le domaine de Fourier est de 2 * Nyquist / N (où N est le nombre total d'échantillons). Si vous souhaitez un espacement plus proche, vous pouvez zéro cavalier votre signal d'entrée.
@Efunkh je sais que je peux changer la fréquence en remplissant des nombres entiers en modifiant la variable 'Shift', mais comment puis-je modifier la fréquence à l'aide de numéros avec des endroits décimaux tels que 0,754 ou 1.2345 ou 67.456. Si je modifie la variable 'Shift' sur un numéro non-tout entier comme un nombre entier 5.1, je reçois une erreur Les indices de l'indice d'indice doivent être soit des entiers positifs inférieurs à 2 ^ 31 ou logiques
J'ai aussi ajouté la ligne où l'erreur vient de
Un mode de déplacement général de fréquence consiste à apposer le signal, mélangez-le avec un support lors de la suppression d'une bande latérale, puis de sous-échantillon. Vous pouvez faire des changements de fréquence complètement arbitraires de cette façon, le coût est O (n) et vous ne traitez pas de FFT :)
@Kuba Oberc merci, mais je ne suis pas vraiment sûr de ce que vous voulez dire ou comment programmer votre réponse pour tester cela
@Rickt Je suppose que vous ciblez une fréquence particulière? Comme si vous essayez de déplacer le signal de 5,245 Hz? La FFT est discrète afin que vous ne puissiez pas changer le signal par des échantillons entier, mais il est facile d'obtenir un échantillon arbitraire en modifiant simplement la longueur du signal (tout en gardant la constante FS). Exécutez votre programme pour T = [0: 1 / (FS-1): 1] et T = [0: 1 / (FS-1): 3] et vous verrez que la quantité de changement de fréquence pendant cinq échantillons de changement de vitesse changements dans chaque cas. Si c'est ce que vous voulez, je vais écrire une réponse plus détaillée lorsque j'en ai la chance.
@Efunkh J'essaie de changer de fréquence le signal importé par un montant exemplaire à titre d'exemple si le signal importé est de 3,2Hz (veuillez noter que les signaux importés seront des fichiers audio de la parole humaine) et je veux augmenter le changement de 5,1Hz. La nouvelle fréquence sera de 8,3Hz. (3.2HZ + 5,1HZ = 8.3Hz)