[英]Power spectrum of wav file using python
我试图加载波形文件并使用傅立叶变换打印其频谱。 我遵循了我找到的书并从那里得到了一些代码,但是结果有点不同。
def read_wave(filename):
fp=wave.open(filename,'r')
nchannels=fp.getnchannels()
framerate=fp.getframerate()
nframes=fp.getnframes()
sampwidth=fp.getsampwidth()
z_str=fp.readframes(nframes)
fp.close()
dtype_map={1:np.uint8,2:np.uint16}
ys=np.frombuffer(z_str,dtype=dtype_map[sampwidth])
waveObject=Wave(ys,framerate=framerate)
return waveObject
class Wave:
def __init__(self,ys,ts=None,framerate=None):
# ys:wave array
# ts:array of time
self.ys=np.asanyarray(ys)
self.framerate=framerate
if ts is None:
self.ts =np.arange(len(ys))/self.framerate
else:
self.ts=ts
def make_spectrum(self):
n=len(self.ys);
d=1/self.framerate;
hs = np.fft.rfft(self.ys)
fs = np.fft.rfftfreq(n, d)
return Spectrum(hs,fs,self.framerate)
class Spectrum:
def __init__(self,hs,fs,framerate):
# hs : array of amplitudes (real or complex)
# fs : array of frequencies
self.hs=np.asanyarray(hs)
self.fs=np.asanyarray(fs)
self.framerate=framerate
@property
def amps(self):
return np.absolute(self.hs)
def plot(self, high=None):
plt.plot(self.fs, self.amps)
data=read_wave('hate.wav') <br>
spectrum=data.make_spectrum()<br>
spectrum.plot()<br>
但是我得到的频谱看起来像这样,看起来不正确,有什么帮助吗?
在f = 0处有一个巨大的峰值,这表明信号具有恒定的偏移量。
它可能与使用无符号整数类型有关:
dtype_map={1:np.uint8,2:np.uint16}
尝试使用带符号的类型,或从信号中减去平均值以消除偏移。
WAVE文件中存储的无符号8位样本的范围为0到255,因此具有DC偏移。 您的FFT在一开始就显示此DC偏移具有巨大的尖峰。 从每个样本中减去DC偏移(应为128,或者由于记录错误而导致的某个值大约为128)将消除FFT中巨大的DC偏移尖峰,并允许图自动缩放以更好地显示其他频率段。
WAVE文件中的16位样本为有符号整数格式,因此将其读取为无符号值可能会破坏数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.