代码之家  ›  专栏  ›  技术社区  ›  mahboudz

仪器调谐器的auriotouch&fft

  •  3
  • mahboudz  · 技术社区  · 15 年前

    我正在尝试编写一个简单的调谐器(不,不是为了制作另一个调谐器应用),并且正在查看Auriotouch示例源(有人试图评论这段代码吗??)

    我担心的是,在查看频域图时,auriotouch似乎并不能很好地工作。我在乐器上演奏一个音符,我看不到一个有序的,小的,有一个弦峰的频率在音符的适当频率上。

    有没有人使用auriotouch足够了解底层代码是功能性的,还是只是一个粗略的示例?

    我还可以选择使用fftw或kiss-fft。有人有经验吗?

    谢谢。

    4 回复  |  直到 8 年前
        1
  •  2
  •   zaph    15 年前

    fft使用频率箱,频率箱宽度基于fft参数。为了找到一个频率,你需要记录它的采样率,至少是样本中最高频率的两倍。然后找出两个周期之间的时间。如果它不是一个纯频率,这当然会更加困难。

        2
  •  9
  •   FastAl    8 年前

    你想错了!!

    不是图书馆的错

    无论库是否正确地生成它,您都在寻找一个在实际声音中很少实际存在的模式。只有一个完美的正弦波,电子产生,将导致一个均匀的部分离散出现在频率图中的“尖峰”。如果你不相信,试着在winamp或媒体播放器中启动一个“频谱分析器”可视化。与其说这是个人电脑的错。

    真正的声波是复杂的动物

    想象一下你脑海中的锯齿波或方形波。在fft中,那些锐利的转角或波上的点,看起来像是上吨的高次谐波,甚至是真正的傅立叶。如果你曾经在示波器上看到过真正的“sqaure波/锯齿波”,或者甚至是由一个应该产生正弦波的仪器产生的“正弦波”,只需一个音符就可以看到所有尖锐的角落和缝隙(如果你没有瞄准镜,那就大胆地放大波浪——你放大的越多,你看到的音符就越高)。是的,这些偏差都算作频率。

    在频谱分析中,有时很难区分一个音符和整个乐团的区别。

    但我只听到一个音符!

    那么耳朵是怎么做的呢?它考虑了整个波形。然后你的下半部大脑对上半部大脑的输入是什么:一个音符,而不是一大堆的泛音。

    你不能完全做到这一点,但你可以通过“训练”来近似。

    近似:建筑 一些 聪明的人

    播放乐器上的音符并“保存”频率图。对于多个频率范围内的音符,或者更好的是对所有音符都这样做。

    然后插入注释,通过将该仪器保存的图形乘以2^(1/12)(或1/24乘以1/4步等)来填补空白(乘以1/2或1/4步)。

    找出如何将它们存储在快速可搜索的数据结构中,如bst或trie。只需要返回一个“这有多接近”的分数。它还必须通过频率的比例来识别匹配,以防出现不同的音量。

    使用智能

    下一次你要从那台仪器中寻找一个音符时,只要取下“heard”频率图,并在数据结构中找到它。你可以记录几种不同波形的仪器,并对它们进行搜索。如果有背景声音或多个音符,请进行最接近的匹配。然后,如果你想识别其他的音符,从采样的音符中“减去”找到的频率模式,然后冲洗,用泡沫重复。

    你的声音不起作用…

    如果你曾经试着用吉他调谐器来调节自己,你就会知道调谐器没有那么聪明。当然,有些乐器(声音ESP)确实会在音高上浮动并产生不断变化的波形(即使没有人唱歌)。

    你想完成什么?

    你不必完全喜欢“简单”的调谐器应用程序,但如果你不只是制作另一个调谐器应用程序,我猜你实际上想识别音符(例如,也许你想从收音机中的歌曲自动生成MIDI文件;-)

    祝你好运。我希望你能找到一个能做这些垃圾的图书馆,而不是你自己的。

    编辑2017

    请注意此网页: http://www.feilding.net/sfuad/musi3012-01/html/lectures/015_instruments_II.htm 在这一页下面,有各种器官管道的光谱分析。有很多很多的暗示。如果你先用它们“训练”你的应用程序(就像告诉一个孩子,‘这就是单簧管的声音……’),这些都是可能检测到的——只要足够多的工作就可以了。

        3
  •  4
  •   alexbw    15 年前

    auriotouch看起来很奇怪,因为频率轴是线性的。当x轴不是对数刻度(传统上是log2)时,很难解释fft输出。

    如果你不能使用我的整数FFT,请查看我的库: http://github.com/alexbw/iPhoneFFT

    它使用双精度,支持多种窗口类型,并实现 Welch's method (随着时间的推移,这会给你更稳定的光谱)。

    @zaph,fft确实计算了一个真正的离散傅里叶变换。它只是一种利用数字信号的位表示的有效算法。

        4
  •  0
  •   Yan    15 年前

    我用ooura fft来计算加速度数据的fft。我并不总是得到正确的光谱。由于某种原因,ooura fft在所有频率上产生了10^200阶谱量级的完全错误的结果。