Also versuche ich, die diskrete Fourier-Transformation in C zu schreiben, um mit echten 32-Bit-Float-WAV-Dateien zu arbeiten. Es liest 2 Frames gleichzeitig ein (eines für jeden Kanal, aber für meine Zwecke nehme ich an, dass sie beide gleich sind und so verwende ich Frame [0]). Dieser Code soll das Amplitudenspektrum für eine Eingabedatei durch Sondieren mit den Frequenzen 20, 40, 60, ..., 10000 ausschreiben. Ich verwende ein Hanning-Fenster für die Eingabefelder. Ich möchte vermeiden, komplexe Zahlen zu verwenden, wenn ich kann. Wenn ich das mache, gibt es mir sehr seltsame Amplituden (von denen die meisten extrem klein sind und nicht mit den richtigen Frequenzen verbunden sind), was mich glauben lässt, dass ich einen fundamentalen Fehler in meiner Berechnung mache. Kann jemand einen Einblick geben, was hier passiert? Hier ist mein Code:Schreiben einer einfachen diskreten Fourier-Transformation für reale Eingaben in C
int windowSize = 2205;
int probe[500];
float hann[2205];
int j, n;
// initialize probes to 20,40,60,...,10000
for (j=0; j< len(probe); j++) {
probe[j] = j*20 + 20;
fprintf(f, "%d\n", probe[j]);
}
fprintf(f, "-1\n");
// setup the Hann window
for (n=0; n< len(hann); n++) {
hann[n] = 0.5*(cos((2*M_PI*n/(float)windowSize) + M_PI))+0.5;
}
float angle = 0.0;
float w = 0.0; // windowed sample
float realSum[len(probe)]; // stores the real part of the probe[j] within a window
float imagSum[len(probe)]; // stores the imaginary part of probe[j] within window
float mag[len(probe)]; // stores the calculated amplitude of probe[j] within a window
for (j=0; j<len(probe);j++) {
realSum[j] = 0.0;
imagSum[j] = 0.0;
mag[j] = 0.0;
}
n=0; //count number of samples within current window
framesread = psf_sndReadFloatFrames(ifd,frame,1);
totalread = 0;
while (framesread == 1){
totalread++;
// window the frame with hann value at current sample
w = frame[0]*hann[n];
// determine both real and imag product values at sample n for all probe freqs times the windowed signal
for (j=0; j<len(probe);j++) {
angle = (2.0 * M_PI * probe[j] * n)/windowSize;
realSum[j] = realSum[j] + (w * cos(angle));
imagSum[j] = imagSum[j] + (w * sin(angle));
}
n++;
// checks to see if current window has ended
if (totalread % windowSize == 0) {
fprintf(f, "B(%f)\n", totalread/44100.0);
printf("%f breakpoint written\n", totalread/44100.0);
for (j=0; j < len(mag); j++) { // print out the amplitudes
realSum[j] = realSum[j]/windowSize;
imagSum[j] = imagSum[j]/windowSize;
mag[j] = sqrt(pow((double)realSum[j],2)+pow((double)imagSum[j],2))/windowSize;
fprintf(f, "%d\t%f\n", probe[j], mag[j]);
realSum[j] = 0.0;
imagSum[j] = 0.0;
}
n=0;
}
framesread = psf_sndReadFloatFrames(ifd,frame,1);
}
Es wird kein offensichtlicher Fehler angezeigt, aber ich würde vorschlagen, Testfälle zu generieren und zu überprüfen, ob die mathematischen Eigenschaften der Koeffizienten gut sind - z. Reale Werteingaben bedeuten symmetrische Koeffizienten. – Keith
@Keith Es tut mir leid, ich bin mir nicht sicher, was genau das bedeutet. Was sind die Koeffizienten in diesem Fall? wäre es die Variable w? Und ich habe versucht, dies auf einem A4 bei 440 Hz zu tun, und die DFT zurückgegeben für jede einzelne Frequenz für die gesamte Dauer so ziemlich 0,00000 – maniciam
Wenn alles Null ist, haben Sie ein größeres Problem. Siehe Antwort. – Keith