4

我研究了快速傅立叶变换,但无法找到一种方法让他们从一个信号中解码多个频率。有没有办法分解 fft 计算的结果,以便我们可以看到和弦中的各个音高,或者根据 fft 的结果计算最可能的和弦?

如果没有,是否还有另一种音高检测方法可以在现场环境中检测多个音高?

编辑:我尝试一次不超过六个音高,因为我正在编写的软件处理吉他;如果程序用户有一把七弦吉他,它需要能够最多拾取七个音高。

在这种情况下,FFT(或其他方法)是否能够从单个麦克风信号处理这个问题,还是我必须制作一个单独读取每个字符串的吉他拾音器?

4

3 回答 3

3

参数谱估计有两种众所周知的统计技术。一种是MUSIC ,另一种是ESPRIT。如果您可以将信号表示为加权复指数(即正弦曲线)的总和,则可以应用它们中的任何一个。此外,相关矩阵的特征分解还会告诉您信号中的频率数量,因此您甚至不应该知道这一点。ESPRIT 比 MUSIC 更好,因为您不应该在频域中搜索峰值。结果是直接给你频率。但是,众所周知,MUSIC 更强大。

于 2012-03-08T23:44:08.097 回答
2

你需要先了解什么是' pitch' 真的是(阅读下面的维基百科链接)。当在吉他或钢琴上发出一个音符时,我们听到的不仅仅是一个声音振动频率,而是在不同数学相关频率上发生的多个声音振动的复合。这种不同频率的振动复合的元素被称为谐波或分音。例如,如果我们按下钢琴上的中间 C 键,复合谐波的各个频率将从 261.6 Hz 作为基频开始,523 Hz 将是 2 次谐波,785 Hz 将是 3 次谐波,1046 Hz 将是 4 次谐波,等等。后面的谐波是基频 261.6 Hz 的整数倍(例如:2 x 261.6 = 523、3 x 261.6 = 785、4 x 261.6 = 1046)。

下面,在 GitHub.com,是我设计的一种不寻常的两阶段算法的 C++ 源代码,它可以在 Windows 上播放时对复音 MP3 文件进行实时音高检测。这个免费的应用程序(PitchScope Player,可在网络上获得)经常用于检测 MP3 录音中吉他或萨克斯管独奏的音符。您可以下载适用于 Windows 的可执行文件,以查看我的算法在您选择的 mp3 文件上的运行情况。该算法旨在检测 MP3 或 WAV 音乐文件中任何给定时刻的最主要音高(音符)。在 MP3 录制期间的任何给定时刻,最主要的音高(一个音符)的变化可以准确地推断出音符的开始。

我使用修改后的 DFT 对数变换(类似于 FFT)首先通过寻找具有峰值电平的频率来检测这些可能的谐波(见下图)。由于我为修改后的 Log DFT 收集数据的方式,我不必对信号应用窗口函数,也不必添加和重叠。我创建了 DFT,因此它的频率通道以对数方式定位,以便直接与吉他、萨克斯管等音符产生的谐波频率对齐。

我的音高检测算法实际上是一个两阶段的过程:a)首先检测到 ScalePitch('ScalePitch' 有 12 个可能的音高值:{E、F、F#、G、G#、A、A#、B、C、C#、D , D#} ) b) 并且在确定 ScalePitch 之后,通过检查 4 个可能的 Octave-Candidate 音符的所有谐波来计算 Octave。该算法旨在检测和弦 MP3 文件中任何给定时刻的最主要音高(音符)。这通常对应于器乐独奏的音符。那些对我的两阶段音高检测算法的 C++ 源代码感兴趣的人可能希望从 GitHub.com 上的 SPitchCalc.cpp 文件中的 Estimate_ScalePitch() 函数开始。

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

在此处输入图像描述

于 2017-01-16T16:55:02.320 回答
1

可能需要隔离每根琴弦的吉他拾音器。否则,将所有泛音分开可能是一个非常困难的问题。

于 2012-04-03T20:03:49.240 回答