前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >wav 声音文件快速傅里叶变换

wav 声音文件快速傅里叶变换

作者头像
用户6021899
发布2019-08-14 16:38:46
3K0
发布2019-08-14 16:38:46
举报

本篇涉及到.wav 声音文件的读取,FFT变换以及用matplotlib来显示声音的时域和频域信息。

.wav文件的读取和分析需用到标准库wave和数值计算库numpy。

示例代码如下:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import wave

class Wav_FFT(object):
    def __init__(self, wav_path=r"c:\WINDOWS\Media\Alarm02.wav"):
        self.path = wav_path
        
    def read_wav(self):
        with  wave.open(self.path, "rb") as f:
            parameters = f.getparams()
            self.nchannels, self.sampwidth, self.framerate, self.nframes = parameters[:4]
            self.time_len = self.nframes*1.0 / self.framerate #声音时长
            print("声道数: ", self.nchannels) #声道数:可以是单声道或者是双声道
            print("量化位数[byte]: ", self.sampwidth)#量化位数:一次采样所采集的数据的字节数
            print("采样频率[Hz]: ", self.framerate) #采样频率:一秒内对声音信号的采集次数,常用的有8kHz, 16kHz, 32kHz, 48kHz, 11.025kHz, 22.05kHz, 44.1kHz
            print("采样点数: ", self.nframes)#采样点数
            print("声音时长[s]: ", round(self.time_len,3))#声音时长
            # 读取波形数据
            str_data = f.readframes(self.nframes)
            wave_data = np.fromstring(str_data, dtype=np.short)
            wave_data.shape = -1, self.nchannels
            self.wave_data = wave_data.T
            
    def FFT(self):
        yf = np.fft.fft(self.wave_data)# FFT
        bias =  (yf[:, 0] / self.nframes).real
        yf_amplitude = np.abs(yf)* (2.0/self.nframes)
        yf_amplitude[:, 0] = bias #直流分量(0 Hz处)修正
        self.yf_amplitude = yf_amplitude[:, 0:self.nframes//2]#有效信息只有一半
    
    def plot(self):
        matplotlib.rcParams["font.sans-serif"] = ["SimHei"]
        matplotlib.rcParams["axes.unicode_minus"] = False
        self.time = np.arange(0, self.nframes) * (1.0 / self.framerate)
        self.freq = np.arange(0,self.nframes//2) * self.framerate / self.nframes #实际频率
        for i in range(self.nchannels):
            plt.subplot(2, self.nchannels, i+1)
            plt.plot(self.time, self.wave_data[i,:])
            plt.xlabel("time 时间")
            plt.ylabel("信号值")
            plt.grid()
            plt.title("通道%d 时域信号" %(i+1))
            plt.subplot(2, self.nchannels, self.nchannels+i+1)
            plt.plot(self.freq, self.yf_amplitude[i, :], "r-")
            plt.xlabel("Frequency 频率[Hz]")
            plt.ylabel("Amplitude 幅值")
            plt.grid()
            plt.title("FFT (通道%d 频域信号)"%(i+1))    
        plt.suptitle("wav 声音数据 快速傅里叶变换 示例", fontsize =14, color ="magenta")
        plt.tight_layout()
        plt.show()
 
        
if __name__ == "__main__":
    wav = Wav_FFT(wav_path=r"c:\WINDOWS\Media\Alarm03.wav")
    wav.read_wav()
    wav.FFT()
    wav.plot()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档