On Sunday, 15 September 2013 at 20:58:54 UTC, Kadir Erdem Demir
wrote:
On Sunday, 15 September 2013 at 15:39:14 UTC, John Colvin wrote:
On Sunday, 15 September 2013 at 15:15:28 UTC, Kadir Erdem
Demir wrote:
I am using fft function from std.numeric
Complex!double[] resultfft = fft(timeDomainAmplitudeVal);
The parameter timeDomainAmplitudeVal is audio amplitude data.
Sample rate 44100 hz and there is 131072(2^16) samples
I am seeing that resultfft has the same size as
timeDomainAmplitudeVal(131072) which does not fits my
project(also makes no sense).
That's what the FFT does. See here:
http://stackoverflow.com/questions/4364823/how-to-get-frequency-from-fft-result
I believe I am well aware of the things which are explained in
the link. There is a sentence in link which says : "The first
bin in the FFT is DC (0 Hz), the second bin is Fs / N, where Fs
is the sample rate and N is the size of the FFT."
My question how can I determine the "N" which is the size of
FFT ?
In fftw library one can define N like :
fftw_create_plan(N, FFTW_FORWARD, FFTW_ESTIMATE);
In D do we have a way to do that ?
Others are correct, the FFT result is always the same length as
the input and the 'N' is the number of samples you have to
transform. See this page:
http://www.fftw.org/fftw2_doc/fftw_2.html
and the example from it:
#include <fftw.h>
...
{
fftw_complex in[N], out[N]; // <== N = number of samples
fftw_plan p;
...
p = fftw_create_plan(N, FFTW_FORWARD, FFTW_ESTIMATE);
...
fftw_one(p, in, out);
...
fftw_destroy_plan(p);
}
As you're probably aware, the FFT result will be symmetrical
around frequency N/2. However, the result array is not centred
around "elelment" N/2 but rather the symmetry is at each end,
wrapping from N back to 0. Like this:
| |
|| ||
|||....|||
You need to shift it to get it centred around N/2
|
|||
..|||||..
Cheers,
G.