我有一個vDSP_zrip & AudioUnit的使用和配置問題。事實上,我配置了AudioUnit以將打包數據保存爲浮點數。 我創建了一個循環緩衝區,當這個緩衝區滿時,我計算一個fft。 我有一個結果,但我不明白爲什麼FFT輸出中是壞的(參見圖)帶浮動緩衝區的FFT輸出AudioUnit
AudioUnit配置:
// describe format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagsNativeEndian|kAudioFormatFlagIsPacked|kAudioFormatFlagIsFloat|kAudioFormatFlagIsNonInterleaved;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1; // mono
audioFormat.mBitsPerChannel = sizeof(float) * 8;
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(float);
audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame;
循環緩衝區:
_audioSample = new AudioSample(8192, 44100);
// in recording callback :
for(int i = 0; i < bufferList.mNumberBuffers; ++i)
{
if(!status)
{
if(_sample->needData())
_sample->put((float*)bufferList.mBuffers[i].mData,
bufferList.mBuffers[i].mDataByteSize);
[...]
}
}
VDSP電話:
// get a split complex vector (real signal divided into an even-odd config
vDSP_ctoz((COMPLEX *)sample.get(), 2, &_complex, 1, _fftsize);
vDSP_fft_zrip(_fftsetup, &_complex, 1, _log2n, kFFTDirection_Forward);
// scale (from vDSP reference)
float scale = 1.0/(2.0 * _samples);
vDSP_vsmul(_complex.realp, 1, &scale, _complex.realp, 1, _fftsize);
vDSP_vsmul(_complex.imagp, 1, &scale, _complex.imagp, 1, _fftsize);
_complex.imagp[0] = 0.0;
其中_fftsize = _audioSample.capacity()/2
澄清,你的輸出有什麼不好?它看起來非常合理的FFT輸出。什麼是輸入?預期產出是多少? – admsyn