1

在业余时间搞砸了一点之后,portaudio我尝试在麦克风打开时传输频率,为此我编写了一个回调 - 回调打开 一个输出流,然后我使用 portaudio 的记录回调。如果示例格式因为输出被定义paFloat32为什么都听不到,但是如果我将其定义paUInt8为通道数 1,所以我听到了声音(如 beep() 声音)但音高检测(使用 FFT)与我传输的频率不同. 所以我的问题是因为 FFT 实施错误(或者 - 是否可以使用 paUint8 并且仍然得到正确答案)或者我应该尝试使用阻塞 I/O?

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

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

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

PSpaUInt8 :尽管我使用了 2 个回调(1 个用于读取,1 个用于写入) ,但任何关于为什么可以传输的解释。

4

1 回答 1

2

没有更多代码是不可能知道问题出在哪里的,但我可以说几件事:

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

  • 如果你在做 paFloat32 时没有听到任何声音,你可能做错了什么,因为对 paFloat32 的支持非常好。浮点类型的范围在 -1 和 1 之间。确保这是您输出的内容。您还可以尝试 PortAudio 中包含的一些出色的代码示例。使用回调查找使用 paFloat32 输出的一个,看看它是否有效(比如这个)。

  • 如果您在 FFT 检测中得到错误的音高,那么您可能也做错了。有两种可能:1.音高不是你想象的那样,2.你的FFT音高检测错误。没有代码,我只能猜测,但由于每个人都遇到了#2 的问题(从 SO 上的问题来看),我猜你至少在这方面遇到了麻烦。

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

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

为了创建正确的音高,这里有很多关于 SO 的问题。

于 2012-11-02T16:08:11.547 回答