Attualmente sto cercando di scrivere un algoritmo di trasformata di Fourier. Ho iniziato con un semplice algoritmo DFT come descritto nella definizione matematica:Trasformata di Fourier discreta
public class DFT {
public static Complex[] Transform(Complex[] input) {
int N = input.Length;
Complex[] output = new Complex[N];
double arg = -2.0 * Math.PI/(double)N;
for (int n = 0; n < N; n++) {
output[n] = new Complex();
for (int k = 0; k < N; k++)
output[n] += input[k] * Complex.Polar(1, arg * (double)n * (double)k);
}
return output;
}
}
Così ho provato questo algoritmo con il seguente codice:
private int samplingFrequency = 120;
private int numberValues = 240;
private void doCalc(object sender, EventArgs e) {
Complex[] input = new Complex[numberValues];
Complex[] output = new Complex[numberValues];
double t = 0;
double y = 0;
for (int i = 0; i < numberValues; i++) {
t = (double)i/(double)samplingFrequency;
y = Math.Sin(2 * Math.PI * t);
input[i] = new Complex(y, 0);
}
output = DFT.Transform(input);
printFunc(input);
printAbs(output);
}
La trasformazione funziona bene, ma solo se numberValues è un multiplo numero della frequenza di campionamento (in questo caso: 120, 240, 360, ...). Quello è il mio risultato per 240 valori:
http://s1.directupload.net/images/110928/n3m8hqg6.jpg
La trasformazione appena finito di lavorare bene.
Se sto cercando di calcolare i valori di 280 ottengo questo risultato:
http://s7.directupload.net/images/110928/qizoiqbt.jpg
perché sto ottenendo un risultato errato se cambio il numero dei miei valori calcolati? Non sono sicuro che il mio problema qui sia un problema con il mio codice o un fraintendimento della definizione matematica della DFT. In ogni caso, qualcuno può aiutarmi con il mio problema? Grazie.
Puoi farmi sapere perché l'input per la tua funzione di trasformazione è un array complesso?Sicuramente se stai convertendo da un'onda sonora standard (dominio del tempo), sarebbe un singolo doppio array? –
Ok, ho capito: la parte immaginaria è impostata su 0, quindi è essenzialmente uguale a se fosse solo un singolo doppio. Tra l'altro nel tuo codice, "Complex.Polar" dovrebbe essere "Complex.FromPolarCoordinates". –
cosa usi per le trame? – GorillaApe