我在我的PC上(-1和+1之间)使用32位浮点音频(44.1Khz),使用Port Audio并使用fftw采用fft。fftw 16bit Audio :: peak出现错误2f
现在我需要采取16位int音频并采取其fft。我已将音频样本转换为在-1和+1之间浮动。 fft可以工作,但峰值出现的频率应为2倍,因此最大频率分辨率也会降低。所以在44KHz的情况下,我能看到的最大分量是10KHz左右,而32K的整数/浮点频率是20KHz左右。
例如,如果我将来自符号发生器的10KHz信号提供给声卡,则峰值现在显示为20KHz。而我唯一改变的是从paInt32到paInt16的格式。它在paInt32格式上正常工作。
outputStreamParam.channelCount = 1;
outputStreamParam.device = Pa_GetDefaultOutputDevice();
outputStreamParam.sampleFormat = paInt16;
outputStreamParam.suggestedLatency = suggestedLatency;
outputStreamParam.hostApiSpecificStreamInfo = NULL;
inputStreamParam.channelCount = 1;
inputStreamParam.device = Pa_GetDefaultInputDevice();
inputStreamParam.sampleFormat = paInt16;
inputStreamParam.suggestedLatency = suggestedLatency;
inputStreamParam.hostApiSpecificStreamInfo = NULL;
将int(16或32)转换为-1和+1之间的浮点数。
int audioProcessor::processingCallback(const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags)
{ unsigned int i;
framesPerBuffer = framesPerBuffer/2;
int *inint = (int*) inputBuffer;
float *out = (float*) outputBuffer;
float *in = (float*) inputBuffer;
for(i=0; i<framesPerBuffer; i++)
{
in[i] = inint[i]/2147483647.0f;
}
FFTW处理器代码。
this->fftSize = fftSize;
cout << "Plan start " << endl;
outArraySize = fftSize/2+1;
cout << "fft Processor start \n";
fftIn = (double*) fftw_malloc(sizeof(double) * fftSize);
fftOut = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * outArraySize);
fftOutAbs = (double*) fftw_malloc(sizeof(double) * outArraySize);
// fftwPlan = fftw_plan_dft_r2c_1d(fftSize, fftIn, fftOut, FFTW_ESTIMATE);
cout << "Plan succeed " << endl;
fftwPlan = fftw_plan_dft_r2c_1d(fftSize, fftIn, fftOut, FFTW_MEASURE);
}
你是否对16位和32位使用相同的int-> float转换? – jaket