Salut !
Comment calculer un signal dont la fréquence varie dans le temps ?
On a :
- une fréquence de départ
- une fréquence d'arrivée
- une durée pendant laquelle la fréquence de départ tend (croît ou décroît selon que...) vers la fréquence d'arrivée
- au delà de la durée, la fréquence est verrouillée sur la fréquence d'arrivée.
Pour être plus précis, il s'agit de faire un petit automate me permettant de calculer ce signal échantillon par échantillon.
C'est ni plus ni moins qu'un signal de commande pour obtenir un vibrato d'un type particulier, en utilisant l'automate en tant que LFO.
J'ai essayé plusieurs méthodes mais elles n'apportent pas le résultat souhaité.
Voici la première, sans doute la plus "primaire"... parce que aussi simple que ça, ça aurait été trop beau !
Précalculé pour soulager le temps de calcul échantillon par échantillon
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int Time; //durée en terme d'échantillons pour la variation de fréquence int Compteur = 0; int Sample = 0; double Freq_dep; double Freq_arr; double fo; double result; #define Pi 6.28318530717958
L'automate calcule les échantillons ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part double step = (Freq_arr - Freq_dep) / Time; //au premier abord...
Le résultat est catastrophique dans la mesure où la variation obtenue est trop grande ce qui se traduit par un changement brutal de fréquence au moment où l'algo se verrouille sur la fréquence d'arrivée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 if(Compteur <= Time) { fo = Freq_dep + (step * Compteur); //au premier abord... Compteur++; } d = fmod(Sample * fo * Pi / 44100.0, Pi); //rem Pi vaut 2*pi result = sin(d); Sample++;
Sinon pour les autres essais... je les garde en tant que "Automates Gazouilleurs" !
A plus !
Partager