绘制numpy rfft

时间:2018-03-09 18:24:30

标签: python numpy plot signal-processing fft

我正在尝试绘制wav文件的fft,我已经使用常规fft成功完成了它,但我想试验rfft,因为我的应用程序是在音乐中执行此操作。当我尝试绘制xfyf时(图2),我遇到xf长度为yf一半的问题,我无法弄清楚原因,我假设它由于缺少负频率但我认为将rfftrfftfreq的函数调用都改为处理它。

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()

2 个答案:

答案 0 :(得分:0)

您需要将频率转换为采样率。请参阅https://stackoverflow.com/a/27191172/7919597或rfftfreq的文档:

#![feature(generic_param_attrs)]
#![feature(dropck_eyepatch)]

答案 1 :(得分:0)

用于numpy.fft.rfftnumpy.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))