在我的业余时间用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
进行传输的任何解释。
答案 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
为了创造正确的音调,这里有很多问题。