【问题标题】:Qt4 and SFML pitch recognition and processing [closed]Qt4 和 SFML 音高识别和处理
【发布时间】:2012-01-24 17:07:26
【问题描述】:

我正在编写一个显示随机自然音符并等待用户在吉他上弹奏该音符的程序。处理音频输入以查看是否播放了正确的音高,如果是,则显示下一个音符并更新用户的分数。这个想法是教基本的吉他音符。

我打算将 SFML 用于音频处理,将 QT4 用于 gui。我将有一个从相关 QObject 和 SFML 类派生的小部件。

问题:如何使用 SFML 检测麦克风输入的音高?是否可以简单地将输入的一部分存储在 sf::sound 对象中并调用它的 getPitch() 方法?

【问题讨论】:

  • 我已经删除了 qt4 标签,因为问题与它无关

标签: sfml guitar audio


【解决方案1】:

事实证明,SFML 没有内置任何用于检测音高的算法。感谢 LBg 让我的思维朝着正确的方向发展。 SFML 仅提供录制声音并将其存储在缓冲区中所需的工具。

我发现我可以使用快速傅立叶变换来评估缓冲区的频率。然后可以将此频率与已知音高频率列表以及音高阈值进行比较。

虽然 SFML 没有内置 fft 算法,但它确实具有获取声音缓冲区所需的工具。我将不得不检查一下这是否是最跨平台的做事方式。

【讨论】:

    【解决方案2】:

    是否可以简单地将输入的一部分存储在 sf::sound 对象中并调用它的 getPitch() 方法?

    来自sf::SoundSourceGetPitch() 将返回您在SetPitch(pitch) 或默认1.0f 上使用的值。它是编辑声音,而不是获取有关它的信息。我认为唯一的方法是获取声音样本数组并使用某种算法对其进行处理。你可以用它得到这个数组:

    sf::SoundBufferRecorder recorder;
    recorder.Start();
    // ...
    recorder.Stop();
    const sf::SoundBuffer& buffer = recorder.GetBuffer();
    
    size_t           sample_count       = buffer.GetSamplesCount();
    const sf::Int16* samples            = buffer.GetSamples();
    unsigned int     samples_per_second = buffer.GetSampleRate();
    

    【讨论】:

    • 感谢您的意见;我发现了 FFT 对声音缓冲区的间接影响。
    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 2013-07-24
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多