N step fft in D language
kraybit
stdin at kraybit.com
Tue Sep 17 04:39:16 PDT 2013
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 ?
Hi!
Haven't tried this, but looking at the docs it looks like you
have to:
auto mySample = getSampleData();
auto fftData0 = fft(mySample[0..512]);
auto fftData1 = fft(mySample[512..1024]);
...
This would give you the frequency correlation data for two
"windows" in time, and by reading that stackoverflow I assume for
256 frequencies each.
Docs also says there's a class you can reuse if you know the max
size, which should be faster.
auto ffter = new Fft(512);
foreach(chunk; getSampleByChunk(512))
{
auto fftData = ffter.fft(chunk);
...
}
The FFT size, "N", is the same as the number of samples you
provide it. So the more data you provide, the finer correlation
detail you get. I think it makes sense?
Hmm, what it seems you have done is pass the entire sample
though, which gives you an FFT of size 131072. So you get
phenomenally good detail in frequency correlation, but just one
huge time window—the entire sample! I think what you're simply
looking for is chopping it up into smaller pieces and run fft on
each—that's at least what most audio tools do I believe.
kind regards
k
More information about the Digitalmars-d-learn
mailing list