如何用Python实现读取WAV文件并绘制其频谱图示例?

2026-05-28 21:512阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1036个文字,预计阅读时间需要5分钟。

如何用Python实现读取WAV文件并绘制其频谱图示例?

使用Python读取WAV文件的基本步骤如下:

pythonimport waveimport struct

打开WAV文件with wave.open('yourfile.wav', 'rb') as wav_file: # 获取WAV文件的基本参数 n_channels, sampwidth, framerate, n_frames, comptype, compname=wav_file.getparams()

# 读取音频数据 frames=wav_file.readframes(n_frames)

# 解析音频数据 if sampwidth==2: # 读取16位音频数据 audio_data=struct.unpack('<' + 'h' * n_channels * n_frames, frames) elif sampwidth==4: # 读取32位音频数据 audio_data=struct.unpack('<' + 'l' * n_channels * n_frames, frames) else: raise ValueError(Unsupported sample width)

Python 读取WAV文件

import wave import struct from scipy import * from pylab import * #读取wav文件,我这儿读了个自己用python写的音阶的wav filename = '1.wav' wavefile = wave.open(filename, 'r') # open for writing #读取wav文件的四种信息的函数。期中numframes表示一共读取了几个frames,在后面要用到滴。 nchannels = wavefile.getnchannels() sample_width = wavefile.getsampwidth() framerate = wavefile.getframerate() numframes = wavefile.getnframes() print("channel",nchannels) print("sample_width",sample_width) print("framerate",framerate) print("numframes",numframes) #建一个y的数列,用来保存后面读的每个frame的amplitude。 y = zeros(numframes) #for循环,readframe(1)每次读一个frame,取其前两位,是左声道的信息。右声道就是后两位啦。 #unpack是struct里的一个函数,用法详见docs.python.org/library/struct.html。简单说来就是把#packed的string转换成原来的数据,无论是什么样的数据都返回一个tuple。这里返回的是长度为一的一个 #tuple,所以我们取它的第零位。 for i in range(numframes): val = wavefile.readframes(1) left = val[0:2] #right = val[2:4] v = struct.unpack('h', left )[0] y[i] = v #framerate就是44100,文件初读取的值。然后本程序最关键的一步!specgram!实在太简单了。。。 Fs = framerate specgram(y, NFFT=1024, Fs=Fs, noverlap=900) show()

补充知识:matlab生成wav文件并用python验证

在进行频谱分析时,发现MATLAB和python读取wav文件的波形不一致,导致不能得出正确结果,为了验证MATLAB和python哪部分有问题,于是有了这篇博客。

如何用Python实现读取WAV文件并绘制其频谱图示例?

1、需求分析

用MATLAB生成一个正弦波并保存为wav文件,然后用python读取这个wav文件画出波形,查看python读取出来的波形和matlab生成的波形是否一致。

2、代码实现

2.1 MATLAB生成wav文件

Df=5; %频率间隔 fs = 8000; %采样频率 T = 1/fs; %采样周期 N=fs/Df; %序列点数 time = (N-1)./fs; %第一个声音片段的总时长 t=0:T:(N-1)./fs; y = sin(2*pi*200*t); %生成第一个声音片段,注意需要用db2mag()函数把dB转换成magnitude。 sound(y,fs) %可以播放声音的函数 sound() filename = ('sinwave.wav'); %给文件取名 plot(t,y) audiowrite(filename,y,fs) %存储.wav音频文件,在这里文件名为sinwave.wav

其中生成的正弦波波形如下图所示:

2.2 python读取wav文件

import wave import numpy as np import pylab as plt #打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。 f = wave.open(r"E:\练习\音频信号处理\spectrum.m\sinwave.wav","rb") #读取格式信息 #一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采 #样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息 params = f.getparams() nchannels, sampwidth, framerate, nframes = params[:4] #读取波形数据 #读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位) str_data = f.readframes(nframes) f.close() #将波形数据转换成数组 #需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组 wave_data = np.fromstring(str_data,dtype=np.short) #通过取样点数和取样频率计算出每个取样的时间。 time=np.arange(0,nframes)/framerate print(params) print(wave_data.max())#找出正弦波的峰值 #time 也是一个数组,与wave_data[0]或wave_data[1]配对形成系列点坐标 plt.plot(time,wave_data/32768) plt.show()

python读取wav文件显示出来的正弦波如下图所示:

python读取wav文件的信息及求出波形峰值的结果如下图所示:

我们可以看出峰值为32767(该wav文件有16bit,且带一个符号位。215=32768215=32768 ),我们进行归一化处理后的到波形如下图所示:

由上图可以看出MATLAB生成的正弦波保存为wav文件后,python读取该wav文件。两种语言下正弦波相同。

以上这篇Python 读取WAV音频文件 画频谱的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。

标签:实例

本文共计1036个文字,预计阅读时间需要5分钟。

如何用Python实现读取WAV文件并绘制其频谱图示例?

使用Python读取WAV文件的基本步骤如下:

pythonimport waveimport struct

打开WAV文件with wave.open('yourfile.wav', 'rb') as wav_file: # 获取WAV文件的基本参数 n_channels, sampwidth, framerate, n_frames, comptype, compname=wav_file.getparams()

# 读取音频数据 frames=wav_file.readframes(n_frames)

# 解析音频数据 if sampwidth==2: # 读取16位音频数据 audio_data=struct.unpack('<' + 'h' * n_channels * n_frames, frames) elif sampwidth==4: # 读取32位音频数据 audio_data=struct.unpack('<' + 'l' * n_channels * n_frames, frames) else: raise ValueError(Unsupported sample width)

Python 读取WAV文件

import wave import struct from scipy import * from pylab import * #读取wav文件,我这儿读了个自己用python写的音阶的wav filename = '1.wav' wavefile = wave.open(filename, 'r') # open for writing #读取wav文件的四种信息的函数。期中numframes表示一共读取了几个frames,在后面要用到滴。 nchannels = wavefile.getnchannels() sample_width = wavefile.getsampwidth() framerate = wavefile.getframerate() numframes = wavefile.getnframes() print("channel",nchannels) print("sample_width",sample_width) print("framerate",framerate) print("numframes",numframes) #建一个y的数列,用来保存后面读的每个frame的amplitude。 y = zeros(numframes) #for循环,readframe(1)每次读一个frame,取其前两位,是左声道的信息。右声道就是后两位啦。 #unpack是struct里的一个函数,用法详见docs.python.org/library/struct.html。简单说来就是把#packed的string转换成原来的数据,无论是什么样的数据都返回一个tuple。这里返回的是长度为一的一个 #tuple,所以我们取它的第零位。 for i in range(numframes): val = wavefile.readframes(1) left = val[0:2] #right = val[2:4] v = struct.unpack('h', left )[0] y[i] = v #framerate就是44100,文件初读取的值。然后本程序最关键的一步!specgram!实在太简单了。。。 Fs = framerate specgram(y, NFFT=1024, Fs=Fs, noverlap=900) show()

补充知识:matlab生成wav文件并用python验证

在进行频谱分析时,发现MATLAB和python读取wav文件的波形不一致,导致不能得出正确结果,为了验证MATLAB和python哪部分有问题,于是有了这篇博客。

如何用Python实现读取WAV文件并绘制其频谱图示例?

1、需求分析

用MATLAB生成一个正弦波并保存为wav文件,然后用python读取这个wav文件画出波形,查看python读取出来的波形和matlab生成的波形是否一致。

2、代码实现

2.1 MATLAB生成wav文件

Df=5; %频率间隔 fs = 8000; %采样频率 T = 1/fs; %采样周期 N=fs/Df; %序列点数 time = (N-1)./fs; %第一个声音片段的总时长 t=0:T:(N-1)./fs; y = sin(2*pi*200*t); %生成第一个声音片段,注意需要用db2mag()函数把dB转换成magnitude。 sound(y,fs) %可以播放声音的函数 sound() filename = ('sinwave.wav'); %给文件取名 plot(t,y) audiowrite(filename,y,fs) %存储.wav音频文件,在这里文件名为sinwave.wav

其中生成的正弦波波形如下图所示:

2.2 python读取wav文件

import wave import numpy as np import pylab as plt #打开wav文件 ,open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据。 f = wave.open(r"E:\练习\音频信号处理\spectrum.m\sinwave.wav","rb") #读取格式信息 #一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采 #样频率, 采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息 params = f.getparams() nchannels, sampwidth, framerate, nframes = params[:4] #读取波形数据 #读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位) str_data = f.readframes(nframes) f.close() #将波形数据转换成数组 #需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组 wave_data = np.fromstring(str_data,dtype=np.short) #通过取样点数和取样频率计算出每个取样的时间。 time=np.arange(0,nframes)/framerate print(params) print(wave_data.max())#找出正弦波的峰值 #time 也是一个数组,与wave_data[0]或wave_data[1]配对形成系列点坐标 plt.plot(time,wave_data/32768) plt.show()

python读取wav文件显示出来的正弦波如下图所示:

python读取wav文件的信息及求出波形峰值的结果如下图所示:

我们可以看出峰值为32767(该wav文件有16bit,且带一个符号位。215=32768215=32768 ),我们进行归一化处理后的到波形如下图所示:

由上图可以看出MATLAB生成的正弦波保存为wav文件后,python读取该wav文件。两种语言下正弦波相同。

以上这篇Python 读取WAV音频文件 画频谱的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。

标签:实例