繁体   English   中英

使用python的wav文件的功率谱

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM