- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Python 的 NumPy 库进行一些频率分析。我有两个 .wav 文件,它们都包含 440 Hz 正弦波。其中一个是我用 NumPy 正弦函数生成的,另一个是我用 Audacity 生成的。 FFT 在 Python 生成的一个上工作,但在 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()
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)))
最佳答案
让我解释一下为什么您的代码不起作用。以及为什么它适用于 [:44100]
.
首先,你有不同的文件:
440_gen.wav = 1 sec and 44100 samples (counts)
440_audacity.wav = 5 sec and 220500 samples (counts)
自为
440_gen.wav
在 FFT 中,您使用引用点数 N=44100 和采样率 44100,频率分辨率为 1 Hz(以 1 Hz 为增量跟随 bin)。
plt.xlim(0, 1000)
仅对应于 0-1000 Hz 的范围。
440_audacity.wav
在 FFT 中,您使用引用点数 N=220500 和采样率 44100。您的频率分辨率为 0.2 Hz(bin 以 0.2 Hz 的增量跟随) - 在图表上,每个 FFT 样本对应于 0.2 Hz 增量的频率(最小-最大 = +(-) 22500 Hz)。
plt.xlim(0, 1000)
仅对应于 1000x0.2 = 0-200 Hz 的范围。
plt.xlim (0, 5000)
将纠正您的情况并将范围扩展到 0-1000 Hz。
[:44100]
那个
jwalton 引入实际上只强制 FFT 使用 N = 44100。这重复了 440_gen.wav 计算的情况
N (Windows Size)
代码中的参数和
np.fft.fftfreq()
功能。
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as wave
N = 44100 # added
infile = "440_audacity.wav"
rate, data = wave.read(infile)
data = np.array(data)
data_fft = np.fft.fft(data, N) # added N
frequencies = np.abs(data_fft)
x_freq = np.fft.fftfreq(N, 1/44100) # added
plt.subplot(2,1,1)
plt.plot(data[:800])
plt.title("Original wave: " + infile)
plt.subplot(2,1,2)
plt.plot(x_freq, frequencies) # added x_freq
plt.title("Fourier transform results")
plt.xlim(0, 1000)
plt.tight_layout()
plt.show()
关于python - NumPy 快速傅立叶变换 (FFT) 对 Audacity 中生成的正弦波不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55971972/
这是我的问题 1)我有动态y数组数据,使用该数组如何连续绘制波浪。 如果Y数组数据完整,则使用相同的y数组数据继续。 2)声音自动播放在该数组值是143.if我停止不停止。 这是我的代码:
网络上有太多使用 WiFi 或蓝牙传输数据的对讲机应用程序(至少我见过的所有应用程序),但没有一个使用内置天线通过 radio 波传输数据真正的对讲机设备。 是否有任何安全原因?还是限制作为发送器/接
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve this
我正在尝试着手研究 boost wave,但到目前为止,我的运气并不好。 我尝试了网站上的示例代码。如下: #include #include #include #include #inclu
我正在尝试使用 svg 编写一个 javascript 加载器。想法是,它是一个从下到上两侧均匀填充的圆圈,加载器的顶线是一个从左到右不断移动的正弦波。 我能够根据百分比为加载程序创建弧线,如下所示:
这个问题在这里已经有了答案: Is there a one-line function that generates a triangle wave? (8 个答案) 关闭 9 年前。 我试图用 A
当我在论坛中搜索时,我了解到要定位 GPS,我必须通过互联网连接或短信发送坐标。但据我所知,我们可以通过 radio 波进行通信,发送语音、图片、数据。我可以用它来获取数据吗? GPS 设备?因为业余
我是一名优秀的程序员,十分优秀!