我将从wav文件中获取峰值频率。
我用以下代码从wav文件获取峰值频率:
我不知道我哪里错了。 我上传了我的wav文件到脚本生成的wav script_gen.wav,采样率为48000,2个声道,16位。 录制的wavs:2声道wav 采样率为48000,2个声道,16位1声道wav(不允许在此处发布链接,因此将在评论中发布) 采样率为48000,1个声道,16位。
我在audacity中检查了所有这些峰值频率,只显示1000Khz。
但是当我尝试使用我的脚本时,我得到了1声道wav的正确输出,而2声道wav则失败了。
更新:对于2个声道,我得到了一半的峰值频率作为输出。
我感觉自己错过了什么。 有人可以帮帮我吗?
我用以下代码从wav文件获取峰值频率:
import wave
import struct
import numpy as np
import wave
import contextlib
if __name__ == '__main__':
fname = "test.wav"
frate = 0
data_size = 0
with contextlib.closing(wave.open(fname,'r')) as f:
frate = f.getframerate()
data_size = f.getnframes()
wav_file = wave.open(fname, 'r')
data = wav_file.readframes(data_size)
data_size = data_size * wav_file.getnchannels()
print wav_file.getparams()
wav_file.close()
data = struct.unpack('{n}h'.format(n=data_size), data)
data = np.array(data)
w = np.fft.fft(data)
freqs = np.fft.fftfreq(len(w))
print(freqs.min(), freqs.max())
# Find the peak in the coefficients
idx = np.argmax(np.abs(w))
freq = freqs[idx]
freq_in_hertz = abs(freq * frate)
print(freq_in_hertz)
我录制了一个采样率为48000、位宽为16比特、2个通道的wav文件。
在该文件中,我有一个1000Hz的正弦波。
但是脚本输出的只有500Hz。
我不知道哪里出错了。
但是对于单声道和生成的采样率为48000、位宽为16比特、2个通道的wav文件,它可以正常工作。
我使用以下脚本生成了wav文件:
import math
import wave
import struct
if __name__ == '__main__':
# https://dev59.com/7HA65IYBdhLWcg3wyRuk
# http://www.sonicspot.com/guide/wavefiles.html
freq = 1000
data_size = 454656 * 2
fname = "test.wav"
frate = 48000.0
amp = 64000.0
nchannels = 2
sampwidth = 2
framerate = int(frate)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
data = [math.sin(2 * math.pi * freq * (x / frate))
for x in range(data_size)]
wav_file = wave.open(fname, 'w')
wav_file.setparams(
(nchannels, sampwidth, framerate, nframes, comptype, compname))
for v in data:
wav_file.writeframes(struct.pack('h', int(v * amp / 2)))
wav_file.close()
我不知道我哪里错了。 我上传了我的wav文件到脚本生成的wav script_gen.wav,采样率为48000,2个声道,16位。 录制的wavs:2声道wav 采样率为48000,2个声道,16位1声道wav(不允许在此处发布链接,因此将在评论中发布) 采样率为48000,1个声道,16位。
我在audacity中检查了所有这些峰值频率,只显示1000Khz。
但是当我尝试使用我的脚本时,我得到了1声道wav的正确输出,而2声道wav则失败了。
更新:对于2个声道,我得到了一半的峰值频率作为输出。
我感觉自己错过了什么。 有人可以帮帮我吗?