在portaudio中阻止I / O.

时间:2012-11-01 18:25:23

标签: c++ fft portaudio

在我的业余时间用portaudio搞砸了一下我试着在麦克风打开的时候传输一个频率,我写了回调这样做 - 回调只打开  一个输出流,然后我使用portaudio的记录回调。如果输出的样本格式被定义为paFloat32没有听到,但如果我将它定义为paUInt8并且通道数量1因此我听到声音(如哔哔声),但音高检测(使用FFT)与I发送的频率不同。 所以我的问题是因为FFT被错误地实现了(或者 - 是否可以使用paUint8并仍然得到正确的答案)或者我应该尝试使用阻塞I / O?

一些代码(也许会有所帮助):

这是输出流的输出参数(输入流来自录制示例)。

    outputParameters.device = Pa_GetDefaultOutputDevice(); 
    outputParameters.channelCount = 1;      
    outputParameters.sampleFormat = paUInt8; 
    outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
    outputParameters.hostApiSpecificStreamInfo = NULL;

P.S :尽管我使用了2个回调(1个用于阅读,1个用于写入),但为什么可以使用paUInt8进行传输的任何解释。

1 个答案:

答案 0 :(得分:1)

如果没有更多代码,我们无法知道问题所在,但我可以说几点:

  • 切换到阻止对解决您遇到的问题没有任何影响。

  • 如果你在做paFloat32时没有听到任何声音,你可能做错了,因为对paFloat32的支持非常好。浮点类型的范围介于-1和1之间。确保输出的是。您还可以尝试一些PortAudio附带的优秀代码示例。寻找一个使用回调使用paFloat32输出并查看它是否有效(如this one)。

  • 如果您使用FFT检测得到错误的音高,那么您可能也做错了。有两种可能性:1。音高不是你想象的那样,2。你的FFT音高检测是错误的。没有代码,我只能猜测,但由于每个人都遇到#2问题(根据SO的问题判断),我猜你至少遇到了麻烦。

对于FFT音高检测,请查看我的博客条目以及代码(它甚至使用portaudio)

http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html

为了创造正确的音调,这里有很多问题。