目前,我正在尝试获取此一闪一闪小星星文件的音高。在大多数情况下
这些音符的频率正确,这是通过变量index_max得到的。但是,对于C5,它返回C6。 C5的频率约为523,而C6的频率约为1046。FFT告诉我们,该频率比预期结果高 Octave 。这实际上在许多其他文件中都发生,并且似乎音符越低,出现问题的可能性就越大。任何以更好的方式提出这个问题或答案的澄清将不胜感激!

import scipy.io.wavfile as wave
import numpy as np
from frequencyUtil import *
from scipy.fft import fft, ifft

def read_data(scale):
        infile = "twinkle.wav"
        rate, data = wave.read(infile)
        sample_rate = int(rate/scale)
        time_frames = [data[i:i + sample_rate] for i in range(0, len(data), sample_rate)]
        notes = []
        for x in range(len(time_frames)):                               # for each section, get the FFT
                if(type(data[0]) is np.int16):                               # If not dual channel process like normal
                        dataZero = np.array(time_frames[x])
                else:                                                   # if is dual channel get first ele of every list
                        data = np.array(time_frames[x])  # convert to np array
                        dataZero = [row[0] for row in data]
                frequencies = fft(dataZero)                          # get the FFT of the wav file

                inverse = ifft(np.real(frequencies))

                index_max = np.argmax(np.abs(frequencies[0:8800//scale]))      # get the index of the max number within music range
                #print(abs(frequencies[index_max]))
                # filters out the amplitudes that are lower than this value found through testing
                # should eventually understand the scale of the fft frequencies
                if(abs(frequencies[index_max]) < 4000000/scale):
                       continue
                index_max = index_max*scale
                print(index_max)
                notes.append(index_max)
        return notes```

最佳答案

许多基音(尤其是低音)在频谱中具有比基音强的泛音或谐波。那些泛音使乐器或声音听起来比正弦波发生器更有趣。但是,由于音调是心理声学现象,因此人类的大脑会进行必要的校正以感知音调。
因此,FFT幅度 vector 中最强的频谱峰值通常不在音调频率处,因为该音调具有非平凡的频谱。
关于音高检测和估计问题,有大量的学术论文和文章。许多使用倒谱/倒谱,自相关,机器学习等方法。

关于python - 为什么最高的FFT峰值不是音调的基频?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62615983/

10-11 00:54