Ho un lettore audio che utilizza NAudio e mi piacerebbe visualizzare un'intensità in tempo reale per ogni banda di frequenza.NAudio intensità banda di frequenza
ho un evento attivato per ogni blocco di 1024 campioni:
public void Update(Complex[] fftResults)
{
// ??
}
Nei vorrei avere è un array di numeri che indicano l'intensità di ciascuna banda di frequenza. Diciamo che mi piacerebbe dividere la finestra in 16 bande.
Per esempio, quando ci sono più basse frequenze potrebbe assomigliare a questo:
░░░░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓░░░░░░░░░░░░░
▓▓▓▓░░░░░░░░░░░░
▓▓▓▓▓░░░░░░░░░░░
▓▓▓▓▓▓▓▓░░░▓░░▓░
Cosa devo mettere in quel gestore di eventi, se questo è possibile con quei dati?
I dati in arrivo (Complesso []) sono già stati trasformati con la FFT. È un flusso stereo.
Prima prova:
double[] bandIntensity = new double[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public void Update(Complex[] fftResults)
{
// using half fftResults because the others are just mirrored
int band = 0;
for (int n = 0; n < fftResults.Length/2; n++)
{
band = (int)((double)n/(fftResults.Length/2) * bandIntensity.Length);
bandIntensity[band] += Math.Sqrt(fftResults[n].X * fftResults[n].X + fftResults[n].Y * fftResults[n].Y);
bandIntensity[band] /= 2;
}
}
È possibile che questo sta facendo qualcosa, ma penso troppo va nelle prime due fasce, e sto giocando Shakira che non ha più di tanto bassi.
Grazie!
sei il mio eroe. lol. –
Per la finestra vedo che si usa BlackmannHarrisWindow. Tuttavia non ho ancora provato il 10xLog10(), vedrò come questo cambia il grafico. E rimuoverò il cestino 0Hz DC. –
anche dopo aver applicato un ottava bin alla raccolta a banda, ottengo ancora numeri strani, ancora troppo sul lato sinistro ... ho convertito i numeri della scala y in dB –