具有Accelerate框架vDSP的iPhone FFT
|
我在使用vDSP实现FFT时遇到困难。我了解理论,但正在寻找特定的代码示例。
我有来自wav文件的数据,如下所示:
问题1.如何将音频数据放入FFT?
问题2.如何从FFT中获取输出数据?
问题3.最终目标是检查低频声音。我该怎么做?
-(OSStatus)open:(CFURLRef)inputURL{
OSStatus result = -1;
result = AudioFileOpenURL (inputURL, kAudioFileReadPermission, 0, &mAudioFile);
if (result == noErr) {
//get format info
UInt32 size = sizeof(mASBD);
result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyDataFormat, &size, &mASBD);
UInt32 dataSize = sizeof packetCount;
result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &dataSize, &packetCount);
NSLog([NSString stringWithFormat:@\"File Opened, packet Count: %d\", packetCount]);
UInt32 packetsRead = packetCount;
UInt32 numBytesRead = -1;
if (packetCount > 0) {
//allocate buffer
audioData = (SInt16*)malloc( 2 *packetCount);
//read the packets
result = AudioFileReadPackets (mAudioFile, false, &numBytesRead, NULL, 0, &packetsRead, audioData);
NSLog([NSString stringWithFormat:@\"Read %d bytes, %d packets\", numBytesRead, packetsRead]);
}
}
return result;
}
FFT代码如下:
log2n = N;
n = 1 << log2n;
stride = 1;
nOver2 = n / 2;
printf(\"1D real FFT of length log2 ( %d ) = %d\\n\\n\", n, log2n);
/* Allocate memory for the input operands and check its availability,
* use the vector version to get 16-byte alignment. */
A.realp = (float *) malloc(nOver2 * sizeof(float));
A.imagp = (float *) malloc(nOver2 * sizeof(float));
originalReal = (float *) malloc(n * sizeof(float));
obtainedReal = (float *) malloc(n * sizeof(float));
if (originalReal == NULL || A.realp == NULL || A.imagp == NULL) {
printf(\"\\nmalloc failed to allocate memory for the real FFT\"
\"section of the sample.\\n\");
exit(0);
}
/* Generate an input signal in the real domain. */
for (i = 0; i < n; i++)
originalReal[i] = (float) (i + 1);
/* Look at the real signal as an interleaved complex vector by
* casting it. Then call the transformation function vDSP_ctoz to
* get a split complex vector, which for a real signal, divides into
* an even-odd configuration. */
vDSP_ctoz((COMPLEX *) originalReal, 2, &A, 1, nOver2);
/* Set up the required memory for the FFT routines and check its
* availability. */
setupReal = vDSP_create_fftsetup(log2n, FFT_RADIX2);
if (setupReal == NULL) {
printf(\"\\nFFT_Setup failed to allocate enough memory for\"
\"the real FFT.\\n\");
exit(0);
}
/* Carry out a Forward and Inverse FFT transform. */
vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_FORWARD);
vDSP_fft_zrip(setupReal, &A, stride, log2n, FFT_INVERSE);
/* Verify correctness of the results, but first scale it by 2n. */
scale = (float) 1.0 / (2 * n);
vDSP_vsmul(A.realp, 1, &scale, A.realp, 1, nOver2);
vDSP_vsmul(A.imagp, 1, &scale, A.imagp, 1, nOver2);
/* The output signal is now in a split real form. Use the function
* vDSP_ztoc to get a split real vector. */
vDSP_ztoc(&A, 1, (COMPLEX *) obtainedReal, 2, nOver2);
/* Check for accuracy by looking at the inverse transform results. */
Compare(originalReal, obtainedReal, n);
谢谢
没有找到相关结果
已邀请:
3 个回复
系漏
。如果您只对相对幅度感兴趣,则可以降低sqrt并仅计算平方幅度
。 您将查看与您感兴趣的一个或多个频率相对应的一个或多个bin的大小(请参阅(2))。如果采样率为Fs,FFT大小为N,则输出仓bin4ѭ的对应频率由
给出。相反,如果您对特定频率f感兴趣,则感兴趣的区间
由
给出。 补充说明:在计算FFT本身之前,您需要对FFT输入数据应用合适的窗口函数(例如Hann aka Hanning)。
氏脑
遣莫捅炭