I'm wondering what's the easiest/best way to determine the magnitude of a given frequency in a sound.
It's my understanding that a FFT function will return the magnitudes of all frequencies in a signal. I'm wondering if there is any shortcut I could use if I'm only concerned about a specific frequency.
I'll be using the iPhone mic to record the audio. My guess is that I'll be using the Audio Queue Services for recording since I don't need to record the audio to a file. I'm using SDK 4.0, so I can use any of the functions defined in the Accelerate framework (e.g. FFT functions) if needed.
Update: I updated the question to be more clear as per Conrad's suggestion.
If you only need to test for one frequency, you can just calculate the corresponding point of the DFT. The DFT algorithm is O(N^2), but the FFT algorithm reuses intermediate results to achieve O(NlogN) for computation of the DFT. However, if you want only one frequency sample, you can just calculate one output sample of the DFT and achieve O(N) performance.
This can be done by looking at the equation for the DFT on the wikipedia page (I'm not even going to try to type it here) and just calculate Xk for a single k corresponding to the frequency of interest. k is just the indexing on the output of the DFT.
Mapping k (indexes of the DFT output) into real frequencies (Hz) depends on two things:
Real frequencies are mapped to k as follows:
F = k*Fs/N for k = 0 ... N/2-1 ((N-1)/2 for odd N)
or
k = F*N/Fs for F = 0Hz ... Fs/2-Fs/N
where F
is the frequency in Hz, N
is the FFT size, and Fs
is the sampling frequency (Hz). Some things to note:
I've left out quite a few other details for simplicity's sake that shouldn't matter for your application
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With