我正在尝试使用Python的NumPy库进行频率分析。我有两个.wav文件,它们都包含一个440 Hz正弦波。一个是我用NumPy正弦函数生成的,另一个是在Audacity中生成的。FFT适用于由Python生成的那个文件,但对Audacity生成的文件无效。
以下是两个文件的链接:
无法工作的文件:440_audacity.wav 工作的文件:440_gen.wav 这是我用来进行傅里叶变换的代码:
我有两个16位PCM.wav文件,一个来自Audacity,另一个是使用NumPy正弦函数创建的。NumPy生成的文件给出了以下(正确的)结果,440Hz处有尖峰: 虽然Audacity生成的波形看起来相同,但傅里叶变换没有任何结果: 我承认我在这里很茫然。这两个文件应该实际上包含相同的数据。它们以相同的方式编码,并且上图中的波形看起来相同。
下面是用于生成有效文件的代码:
以下是两个文件的链接:
无法工作的文件:440_audacity.wav 工作的文件:440_gen.wav 这是我用来进行傅里叶变换的代码:
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as wave
infile = "440_gen.wav"
rate, data = wave.read(infile)
data = np.array(data)
data_fft = np.fft.fft(data)
frequencies = np.abs(data_fft)
plt.subplot(2,1,1)
plt.plot(data[:800])
plt.title("Original wave: " + infile)
plt.subplot(2,1,2)
plt.plot(frequencies)
plt.title("Fourier transform results")
plt.xlim(0, 1000)
plt.tight_layout()
plt.show()
我有两个16位PCM.wav文件,一个来自Audacity,另一个是使用NumPy正弦函数创建的。NumPy生成的文件给出了以下(正确的)结果,440Hz处有尖峰: 虽然Audacity生成的波形看起来相同,但傅里叶变换没有任何结果: 我承认我在这里很茫然。这两个文件应该实际上包含相同的数据。它们以相同的方式编码,并且上图中的波形看起来相同。
下面是用于生成有效文件的代码:
import numpy as np
import wave
import struct
import matplotlib.pyplot as plt
from operator import add
freq_one = 440.0
num_samples = 44100
sample_rate = 44100.0
amplitude = 12800
file = "440_gen.wav"
s1 = [np.sin(2 * np.pi * freq_one * x/sample_rate) * amplitude for x in range(num_samples)]
sine_one = np.array(s1)
nframes = num_samples
comptype = "NONE"
compname="not compressed"
nchannels = 1
sampwidth = 2
wav_file = wave.open(file, 'w')
wav_file.setparams((nchannels, sampwidth, int(sample_rate), nframes, comptype, compname))
for s in sine_one:
wav_file.writeframes(struct.pack('h', int(s)))
440_gen.wav
吗? - jwaltonaplay 440_gen.wav
录制并查看WAV文件是否正确。 - Angelo Mendes.wav
的代码。此外,“波形在上面的图表上看起来完全相同”并不是正确的。虽然它们的频率相同,但幅度不同(尽管这不应该影响,并且我认为这不是问题所在)。 - jwalton