TIPE synthese sonore: analyse/resynthese additive par temps fréquence
- 181 réponses
- 10 participants
- 20 555 vues
- 12 followers
abel_b
60
Posteur·euse AFfranchi·e
Membre depuis 19 ans
Sujet de la discussion Posté le 16/12/2005 à 19:26:51TIPE synthese sonore: analyse/resynthese additive par temps fréquence
Bonjour à tous,
Voilà, je dois présenter un TIPE sur la synthèse sonore analogique en vue de passer des concours des grandes écoles.
Je voudrais savoir si certains pouvaient m'indiquer des livres (ou site si ça existe) qui approfondissent ce thème (au moins des auteurs).
Ma difficulté est de comprendre le principe de la synthese FM (pas du pt de vue mathematique mais du pt de vue réalisation). En fait j'aimerais savoir si on pouvait me donner de quoi elaborer une simulation de montage qui utiliserait le principe de la FM.
De même je cherche une idée ou quelques conseils pour realiser un montage qui simule une synthèse AM (multiplieur etc...) car je connais bien le principe mais je vois pas quel algorithme appliquer pr avoir des sons semblables à ceux d'instruments de musique par exemple.
Le but final est de faire une experience au labo de physique et de faire une analyse spectrale du signal emis (par exemple le son d'une guitare) et de le comparer au signal qu'on a voulu imiter.
Aussi, je voudrais savoir si qqun pouvait m'indiquer un site où l'on peut trouver l'analyse spectrale de différents instruments de musique (peu importe lesquels)
Merci à vous.
Voilà, je dois présenter un TIPE sur la synthèse sonore analogique en vue de passer des concours des grandes écoles.
Je voudrais savoir si certains pouvaient m'indiquer des livres (ou site si ça existe) qui approfondissent ce thème (au moins des auteurs).
Ma difficulté est de comprendre le principe de la synthese FM (pas du pt de vue mathematique mais du pt de vue réalisation). En fait j'aimerais savoir si on pouvait me donner de quoi elaborer une simulation de montage qui utiliserait le principe de la FM.
De même je cherche une idée ou quelques conseils pour realiser un montage qui simule une synthèse AM (multiplieur etc...) car je connais bien le principe mais je vois pas quel algorithme appliquer pr avoir des sons semblables à ceux d'instruments de musique par exemple.
Le but final est de faire une experience au labo de physique et de faire une analyse spectrale du signal emis (par exemple le son d'une guitare) et de le comparer au signal qu'on a voulu imiter.
Aussi, je voudrais savoir si qqun pouvait m'indiquer un site où l'on peut trouver l'analyse spectrale de différents instruments de musique (peu importe lesquels)
Merci à vous.
pet.delascar
14
Nouvel·le AFfilié·e
Membre depuis 20 ans
171 Posté le 26/01/2007 à 21:08:11
Citation : PS : si tu veux le source d'un additif fait avec le sdk steinberg et JUCE, j'ai ça dans mon chapeau.
ça me dit bien ça, merci.
Ce à quoi je pensais ressemble beaucoup à ce que dit batman, en plus je pensais, mais ça risque d'être chiant, faire évoluer les harmoniques puisqu'elles évoluent au cours du temps, de la même façon que le son d'origine, ça c'est déja fait pour la partie analyse puisque j'analyse les partiels présents dans le son par trame de 1024 échantillons. Ce qui me reste à définir, c'est comment manipuler ces partiels, je pense à faire par multiplicité, et comment les représenter, je pensais à une analyse en 2D de la trame avec le temps en abscicces. Merci pour vos réponses.
batman14
715
Posteur·euse AFfolé·e
Membre depuis 20 ans
172 Posté le 26/01/2007 à 22:34:50
Pour le code, va voir du côté :
http://manson.iiens.net/report/audio-report2.html
Tu trouveras un joli rapport en anglais du travail dessus.
Tu cliques dans la colonne de droite pour choper la dll, y'a les sources juste en dessous.
Voili voilou.
Te casse pas trop la tête pour l'instant sur l'aspect visuel, je pense qu'il faut que tu te concentres plus sur les qualités soniques de ta bête. Fais des essais à la main.
Par contre juste une remarque sur le code : il est sur crade pour le moment, on ne multithread pas les calculs...donc pose moi tes questions en pm si t'en as, j'y répondrais au plus vite !
Je ferais ça sur mon temps libre au cours de l'année à venir, mais je pourrais pas débloquer autant de temps qu'avant dessus.
http://manson.iiens.net/report/audio-report2.html
Tu trouveras un joli rapport en anglais du travail dessus.
Tu cliques dans la colonne de droite pour choper la dll, y'a les sources juste en dessous.
Voili voilou.
Te casse pas trop la tête pour l'instant sur l'aspect visuel, je pense qu'il faut que tu te concentres plus sur les qualités soniques de ta bête. Fais des essais à la main.
Par contre juste une remarque sur le code : il est sur crade pour le moment, on ne multithread pas les calculs...donc pose moi tes questions en pm si t'en as, j'y répondrais au plus vite !
Je ferais ça sur mon temps libre au cours de l'année à venir, mais je pourrais pas débloquer autant de temps qu'avant dessus.
http://soundcloud.com/bat-manson
pet.delascar
14
Nouvel·le AFfilié·e
Membre depuis 20 ans
173 Posté le 27/01/2007 à 11:20:37
Ton plugin a des sonorités intéressantes, ton site a l'air pas mal, bon je m'y met et merci.
batman14
715
Posteur·euse AFfolé·e
Membre depuis 20 ans
174 Posté le 27/01/2007 à 12:08:36
pet.delascar
14
Nouvel·le AFfilié·e
Membre depuis 20 ans
175 Posté le 31/01/2007 à 12:03:06
Toujours concernant mon analyse synthèse, j'ai un petit problème qui doit être solvable en ayant des connaissances en pitch shifting, je vous l'expose:
J'ai découpé mon son d'entrée par trames de 1024 échantillons, puis multiplié par une fenêtre de hamming pour limiter les effets de bord à l'analyse. Ensuite, analysé pour chaque trame les parametres (frequences, amplitudes et phases) constituant mon son (pour x partiels) avec du Fourier (en récursif). Donc je parviens à resynthétiser normalement mon son en sommant pour chaque trame les partiels à l'aide de la formule:
somme_sur_les_partiels(p) de: Amplitude(p) * cos(frequence(p) n + phase(p))
n étant l'indice d'échantillon.
Le problème se pose si je veux modifier la fréquence du son (par exemple si je la multiplie par 2), j'ai alors un problème à la restitution à cause surement de la phase qui génère pour chaque trame des effets de grain. Je demande donc quelques conseils d'un expert du pitch shifting s'il y en a un dans le coin, j'ai vu qu'il y avait des gens malins ici. Merci (ça m'évitera de lire de la doc)...
J'ai découpé mon son d'entrée par trames de 1024 échantillons, puis multiplié par une fenêtre de hamming pour limiter les effets de bord à l'analyse. Ensuite, analysé pour chaque trame les parametres (frequences, amplitudes et phases) constituant mon son (pour x partiels) avec du Fourier (en récursif). Donc je parviens à resynthétiser normalement mon son en sommant pour chaque trame les partiels à l'aide de la formule:
somme_sur_les_partiels(p) de: Amplitude(p) * cos(frequence(p) n + phase(p))
n étant l'indice d'échantillon.
Le problème se pose si je veux modifier la fréquence du son (par exemple si je la multiplie par 2), j'ai alors un problème à la restitution à cause surement de la phase qui génère pour chaque trame des effets de grain. Je demande donc quelques conseils d'un expert du pitch shifting s'il y en a un dans le coin, j'ai vu qu'il y avait des gens malins ici. Merci (ça m'évitera de lire de la doc)...
batman14
715
Posteur·euse AFfolé·e
Membre depuis 20 ans
176 Posté le 31/01/2007 à 15:01:42
Oui, pour moi c'est un problème de phase...
Quand tu shiftes une sinusoide pure, la reconstitution se fait mal, non ?
Tu dois avoir des sauts de phase assez génants...
Mais désolé, je crois que tu va devoir faire un peu de lecture ou attendre que choc repasse dans le coin.
Quand tu shiftes une sinusoide pure, la reconstitution se fait mal, non ?
Tu dois avoir des sauts de phase assez génants...
Mais désolé, je crois que tu va devoir faire un peu de lecture ou attendre que choc repasse dans le coin.
http://soundcloud.com/bat-manson
pet.delascar
14
Nouvel·le AFfilié·e
Membre depuis 20 ans
177 Posté le 01/02/2007 à 11:14:31
Batman a batcerné mon batprobleme.
Pov Gabou
19553
Drogué·e à l’AFéine
Membre depuis 22 ans
178 Posté le 01/02/2007 à 12:41:06
Tu as surement des problemes de "phase wrapping". Le truc a faire, c'est de tester ton algo sur une sinusoide, dont la frequence correspond d'abbord a un bin exact de ta trame de Fourier, puis apres en dehors.
Pour voir comment faire un phase unwrapping, tu peux voir la un code matlab que j'ai poste il y a un moment deja la:
http://www.musicdsp.org/files/vocoder.m
(le code suivant est pour une frame seulement du signal E, h est ta fenetre)
C'est pour un pitch shift en vocoder de phase, mais le principe est grosso modo le meme que pour ce que tu veux faire.
Pour voir comment faire un phase unwrapping, tu peux voir la un code matlab que j'ai poste il y a un moment deja la:
http://www.musicdsp.org/files/vocoder.m
(le code suivant est pour une frame seulement du signal E, h est ta fenetre)
%===================================================
% ( classic analysis part of a phase vocoder )
% Take a frame, and window it
X = h.*E((loop-1) * La + 1loop-1)*La + Nfft);
% XI is the amplitude spectrum, and Phia2 the phase spectrum.
tX = fft(X, Nfft);
Xi = abs(tX);
Phia2 = angle(tX);
%=================================================================
% the part which actually does the time scaling
% One compute the actual pulsations, and shift them. The tricky part
% is here...
omega = mod( (Phia2-Phia1)-2*pi*([0:Nfft-1].')/Nfft * La + pi, 2*pi) - pi;
omega = 2 * pi * ([0:Nfft-1].') / Nfft + omega / La;
Phis2 = Phis1 + lss_frame*omega;
% The new phases values :
Phis1 = Phis2;
Phia1 = Phia2;
%===========================================================
% Synthetise the frame, thanks to the
% computed phase and amplitude spectrum :
% ( classic synthesis part of a phase vocoder )
tfs = Xi.*exp(j*Phis2);
Xr = real(ifft(tfs)).*h;
% overlapp-add the synthetised frame Xr
S((loop-1)*lss_frame+1 : (loop-1) * lss_frame + Nfft) ...
= S((loop-1) * lss_frame + 1loop-1) * lss_frame + Nfft) + Xr;
C'est pour un pitch shift en vocoder de phase, mais le principe est grosso modo le meme que pour ce que tu veux faire.
pet.delascar
14
Nouvel·le AFfilié·e
Membre depuis 20 ans
179 Posté le 01/02/2007 à 14:06:32
Pov Gabou peux-tu m'expliquer brievement ce que tu fais là?
Pov Gabou
19553
Drogué·e à l’AFéine
Membre depuis 22 ans
180 Posté le 01/02/2007 à 16:28:44
C'est assez simple une fois que tu comprends le principe. Imagine que tu as une seule sinusoide a une frequence f dont tu dois calculer l'increment de phase au temps t+1 a partir du temps t. Si tu connais sa frequence, tu sais comment calculer la valeur du signal a tout instant. L'idee est d'etendre ca a une serie de sinusoides.
Une tranformee de Fourier, c'est rigoureusement equivalent a un banc de filtre, ou chaque bande correspond a une des frequence d'analyse. En regardant une bande k quelconque, tu supposes que tu as au max une sinusoide (une sinusoide par bande). Si tu sais quelle est la frequence de cette sinusoide, c'est tres facile de calculer quelle doit etre sa phase a tout instant: de sin(2 * pi * f * tn + phi), tu vas a sin(2 * pi * f * t(n+1) + phi). L'idee est donc de calculer la frequence f de la sinusoide dans cette bande.
L'idee c'est de calculer le decalage de phase entre t(n+1) et tn. Tu as, en considerant la frequence constante entre tn et t(n+1):
sin(wk * tn + phase) a la fenetre tn
sin(wk * t(n+1) + phase) a la fenetre t(n+1).
Donc l'increment total a l'interieur de ton sinus, c'est tout simplement wk * {t(n+1) - tn}. L'idee est de calculer l'argument principal (entre -pi et pi) de cet increment, et d'en deduire la frequence:
omega = mod( (Phia2-Phia1)-2*pi*([0:Nfft-1].')/Nfft * La + pi, 2*pi) - pi;
que tu peux lire comme: pour chaque bande k, calcule la frequence :
2 * pi *f(k) = mod (increment_phase a la bande k - increment_central a la bande k + pi, 2 pi) - pi
(omega etant la pulsation: w = 2 * pi * f, et increment_central correspondant a l'increment theorique si la sinusoide etait centree sur la bande k). Apres, comme tu connais la frequence de ta sinusoide, tu sais exactement combien rajouter a la phase pour avoir continuite, et ce pour chaque bande.
Si la frequence est constante entre deux fenetres, et que tu as une seule sinusoide dans chaque bande, cette methode te permet de faire un pitch shift parfait. Tout le probleme etant evidemment que si tu as des fenetres courtes (pour avoir le moins de changement possible de frequence), tu perdes en resolution frequentielle, et donc tu as plus de chance d'avoir plusieurs sinusoides dans une bande. C'est la fameux compromis temps frequence.
Dans ton cas, c'est un peu different, mais le principe fondamental est le meme: un point d'analyse de fft k (un point = un bin; tu as N bins pour une fft de N points) correspond a un filtre centre a la frequence fs / Nfft * k ou Nfft est le nombre de points de ta FFT, fs la frequence d'echantillonage.
Une tranformee de Fourier, c'est rigoureusement equivalent a un banc de filtre, ou chaque bande correspond a une des frequence d'analyse. En regardant une bande k quelconque, tu supposes que tu as au max une sinusoide (une sinusoide par bande). Si tu sais quelle est la frequence de cette sinusoide, c'est tres facile de calculer quelle doit etre sa phase a tout instant: de sin(2 * pi * f * tn + phi), tu vas a sin(2 * pi * f * t(n+1) + phi). L'idee est donc de calculer la frequence f de la sinusoide dans cette bande.
L'idee c'est de calculer le decalage de phase entre t(n+1) et tn. Tu as, en considerant la frequence constante entre tn et t(n+1):
sin(wk * tn + phase) a la fenetre tn
sin(wk * t(n+1) + phase) a la fenetre t(n+1).
Donc l'increment total a l'interieur de ton sinus, c'est tout simplement wk * {t(n+1) - tn}. L'idee est de calculer l'argument principal (entre -pi et pi) de cet increment, et d'en deduire la frequence:
omega = mod( (Phia2-Phia1)-2*pi*([0:Nfft-1].')/Nfft * La + pi, 2*pi) - pi;
que tu peux lire comme: pour chaque bande k, calcule la frequence :
2 * pi *f(k) = mod (increment_phase a la bande k - increment_central a la bande k + pi, 2 pi) - pi
(omega etant la pulsation: w = 2 * pi * f, et increment_central correspondant a l'increment theorique si la sinusoide etait centree sur la bande k). Apres, comme tu connais la frequence de ta sinusoide, tu sais exactement combien rajouter a la phase pour avoir continuite, et ce pour chaque bande.
Si la frequence est constante entre deux fenetres, et que tu as une seule sinusoide dans chaque bande, cette methode te permet de faire un pitch shift parfait. Tout le probleme etant evidemment que si tu as des fenetres courtes (pour avoir le moins de changement possible de frequence), tu perdes en resolution frequentielle, et donc tu as plus de chance d'avoir plusieurs sinusoides dans une bande. C'est la fameux compromis temps frequence.
Dans ton cas, c'est un peu different, mais le principe fondamental est le meme: un point d'analyse de fft k (un point = un bin; tu as N bins pour une fft de N points) correspond a un filtre centre a la frequence fs / Nfft * k ou Nfft est le nombre de points de ta FFT, fs la frequence d'echantillonage.
- < Liste des sujets
- Charte