【问题标题】:Why does the following FFT result in a different set of frequencies than that used for generation?为什么下面的 FFT 产生的频率集与用于生成的频率集不同?
【发布时间】:2018-09-04 21:25:06
【问题描述】:

我使用以下sox 命令生成音频文件SingleTone.wav

sox -n SingleTone.wav synth 10 sin 525

然后我执行以下程序来对这个音调的样本执行 fft。

import matplotlib.pyplot as plt
from scipy.fftpack import fft, rfft
from scipy.io import wavfile
from sys import argv

# FFT sample count
N = 8192

# Sampling frequency
samples_per_second = 44100

# Frequency resolution
freq_resolution = samples_per_second / N

fs, data = wavfile.read(argv[1])
a = data.T
b=[(ele/2**8.)*2-1 for ele in a]
c = fft(b, N)
d = len(c)/2 - 1 
frequencies = [x*freq_resolution for x in xrange(d)]
print '\n'.join(",".join([str(f),str(x)]) for f, x in zip(frequencies, abs(c[:d])))
plt.plot(frequencies, abs(c[:d]),'r')
plt.show()

我得到的输出是 440 Hz 和 455 Hz 之间的频率尖峰,而不是我预期的 525 Hz

差异的原因是什么?

有效的答案将指向对 FFT 的误解、代码中的错误或设置的任何不正确之处。

【问题讨论】:

  • N = 8192 你真的有这么多样本吗?您似乎根据硬编码数字而不是文件中的信息来设计频率轴。请改用len(data)fs
  • sox 默认不生成 48 kHz 的采样率吗?尝试将rate 44100 添加到您的 sox 命令中
  • @mtrw,是的,它看起来大部分修复了它!
  • 由于我不知道的原因,除了 525 的一个尖峰之外,我似乎还在 0 Hz 处出现尖峰。
  • 0 Hz 处的峰值是直流分量。数据很可能具有 DC 分量,因此所有样本值都是正数,并存储为无符号整数。您听不到直流分量,因此无关紧要。

标签: python audio signal-processing fft sox


【解决方案1】:

试试这个:使用 wav 文件中的采样率,为了方便和减少错误,使用 fft 库提供的频率列表。

这是上面的代码,

#!/usr/bin/python

import matplotlib.pyplot as plt
from scipy.fftpack import fft, rfft, fftfreq, rfftfreq
from scipy.io import wavfile
from sys import argv

samples_per_second, data = wavfile.read(argv[1])

# FFT sample count
N = 8192

a = data.T
b=[(ele/2**8.)*2-1 for ele in a]

c = fft(b, N)
d = len(c)/2 - 1 

frequencies = fftfreq(N,1./samples_per_second)

#print '\n'.join(",".join([str(f),str(x)]) for f, x in zip(frequencies[:d], abs(c[:d])))

plt.plot(frequencies[:d], abs(c[:d]),'r')
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多