我正在尝试绘制wav文件的fft,我已经使用常规fft成功完成了它,但我想试验rfft
,因为我的应用程序是在音乐中执行此操作。当我尝试绘制xf
和yf
时(图2),我遇到xf
长度为yf
一半的问题,我无法弄清楚原因,我假设它由于缺少负频率但我认为将rfft
和rfftfreq
的函数调用都改为处理它。
import numpy as np
import soundfile as sf
import matplotlib.pyplot as plt
square = 'square.wav'
sine = 'sine.wav'
k = '1Khz.wav'
cello = 'cello.wav'
data, fs = sf.read(k)
#Plot the Signal
N = len(data)
T = 1.0/fs
x = np.linspace(0, (N*T), N)
plt.plot(x, data)
plt.grid()
count = 0
yf = np.fft.rfft(data)
xf = np.fft.rfftfreq(yf.size, d=T)
plt.figure(2)
plt.plot(xf, yf)
plt.show()
答案 0 :(得分:0)
您需要将频率转换为采样率。请参阅https://stackoverflow.com/a/27191172/7919597或rfftfreq的文档:
#![feature(generic_param_attrs)]
#![feature(dropck_eyepatch)]
答案 1 :(得分:0)
用于numpy.fft.rfft
和numpy.fft.rfftfreq
的尺寸需要匹配。因此,您应该使用data.size
而不是yf.size
(因为yf
的大小已经因不包括负频率而减少)作为rfftfreq
的参数:
yf = np.fft.rfft(data)
xf = np.fft.rfftfreq(data.size, d=T)
最后请注意,当您使用yf
绘制plt.plot(xf, yf)
时,您会收到关于假想部分丢失的警告。如果您对绘制频谱的幅度感兴趣,则应使用plt.plot(xf, abs(yf))
。