Bonjour a tous,
j'aurais besoin d'un petit coup de main pour calculer le spectre audio à la shadertoy.
Apres moult recherches ici et la sur le net, j'ai fait ceci :
- Récupération du flux audio (mise à l'échelle [-1,1]), application d'un fenetrage de Hann.
- Calcule d'une transformée de fourier (rapide) avec en entrée une suite de nombre complexe (réel = flux audio, imaginaire = 0)
- Pour chaque fréquence (sortie de la FFT)
-- Calcul de la magnitude en utilisant le module du nombre complexe
-- Calcule de l'amplitude en prenant le log10 de la magnitude et bound de l'amplitude entre [0, 1]
Et enfin j'utilise mon tableau d'amplitude pour afficher des bars de hauteur plus ou moins haute.
C'est ceux qu'ils font
ici, et çà fonctionne très bien pour eux.
En revanche je n'obtient pas du tout le même résultat..
La seule différence que j'ai trouvé, est qu'on utilise pas la même bibliothèque pour calculer la FFT, a par ca j'ai bien l'impression de faire la même chose qu'eux

.
Voila, je viens de passer ma soirée dessus, je craque !!
Peut être qu'il manque une étape que je ne vois pas, quelqu'un aurait il une idée (Ponce ? Xtrium ?

)
Je poste mon code au cas ou vous trouvez quelque chose :
void SoundManager::run()
{
fftw_complex *in1, *out1;
fftw_plan p1;
in1 = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * SOUND_DATA_SIZE);
out1 = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * SOUND_DATA_SIZE);
p1 = fftw_plan_dft_1d(SOUND_DATA_SIZE, in1, out1, FFTW_FORWARD, FFTW_ESTIMATE);
ALshort samples[SOUND_DATA_SIZE];
while(true)
{
if(m_captureDevice)
{
ALCint sampleSize;
alcGetIntegerv(m_captureDevice, ALC_CAPTURE_SAMPLES, 1, &sampleSize);
if(sampleSize > SOUND_DATA_SIZE)
{
alcCaptureSamples(m_captureDevice, samples, SOUND_DATA_SIZE);
for(int i=0; i<SOUND_DATA_SIZE; i++)
{
in1[i][0] = double(samples[i])/32768.0 * 0.5 *(1-cos(2*M_PI*i/(SOUND_DATA_SIZE-1))); //Hann Window
in1[i][1] = 0.;
}
fftw_execute(p1);
emit newSpectrumDataChannel1(out1);
}
}
this->msleep(5);
}
fftw_destroy_plan(p1);
fftw_free(in1); fftw_free(out1);
}
void RenderWidget::updateTextureSpectrumChannel1(fftw_complex *out)
{
for(int i=2; i<=SOUND_DATA_SIZE/2; i++)
{
float magnitude = sqrt(out[i][0]*out[i][0]+out[i][1]*out[i][1]);
float amplitude = 0.15 * log(magnitude);
amplitude = fmax(amplitude,0.0);
amplitude = fmin(amplitude,1.0);
m_dataSpectrum[i] = amplitude;
}
}
Mercii !