# -*- coding: utf-8 -*-
import wave
import pylab as pl
import numpy as np
# 打开WAV文档
f = wave.open(r"f:\test.wav", "rb")
# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
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)
wave_data.shape = -1, 2
wave_data = wave_data.T
time = np.arange(0, nframes) * (1.0 / framerate)
# 绘制波形
pl.subplot(211)
pl.plot(time, wave_data[0])
pl.subplot(212)
pl.plot(time, wave_data[1], c="g")
pl.xlabel("time (seconds)")
pl.show()
读取声音波形
本博客所有内容是原创,未经书面许可,严禁任何形式的转
http://blog.csdn.net/u010255642
减少音量
# -*- coding: utf-8 -*-
import wave
import pylab as pl
import numpy as np
# 打开WAV文档
print "open wav files...."
f1 = wave.open(r"f:\speak.wav", "rb")
f2 = wave.open(r"f:\11.wav", "wb")
# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
print "read wav data...."
params = f1.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
# 读取波形数据
str_data = f1.readframes(nframes)
#将波形数据转换为数组,并更改,减少音量
print "update wav data...."
wave_data = np.fromstring(str_data, dtype=np.short)
wave_data =wave_data/100
str_data=wave_data.tostring()
#写波形数据参数
print "save new wav files...."
f2.setnchannels(nchannels)
f2.setframerate(framerate)
f2.setsampwidth(sampwidth)
f2.writeframes(str_data)
print "close wav files...."
f2.close()
f1.close()
将音量控制在某个范围内
# -*- coding: utf-8 -*-
import wave
import pylab as pl
import numpy as np
def wavechange(x,dwmax,dwmin):
if x!=0:
if abs(x)>dwmax:
x=x/abs(x)*dwmax
elif abs(x)<dwmin:
x=x/abs(x)*dwmin
else:
x=x*1.5
return x
# 打开WAV文档
print "open wav files...."
f1 = wave.open(r"f:\speak.wav", "rb")
f2 = wave.open(r"f:\11.wav", "wb")
# 读取格式信息
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
print "read wav data...."
# 读取波形数据
params = f1.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = f1.readframes(nframes)
#将波形数据转换为数组,并更改
print "update wav data...."
wave_data = np.fromstring(str_data, dtype=np.short)
change_dwmax=wave_data.max()/100*88
change_dwmin=wave_data.max()/100*14
wave_change = np.frompyfunc(wavechange,3,1)
new_wave_data =wave_change(wave_data,change_dwmax,change_dwmin)
new_wave_data =new_wave_data.astype(wave_data.dtype)
str_data=new_wave_data.tostring()
#写波形数据参数
print "save new wav files...."
f2.setnchannels(nchannels)
f2.setframerate(framerate)
f2.setsampwidth(sampwidth)
f2.writeframes(str_data)
print "close wav files...."
f2.close()
f1.close()
音频采样 AD
数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的,实现这个步骤使用的设备是模/数转换器(A/D)它以每秒上万次的速率对声波进 行采样,每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本。将一串的样本连接起来,就可以描述一段声波了,把每一秒钟所采样的数目称为采样 频率或采率,单位为HZ(赫兹)。采样频率越高所能描述的声波频率就越高。采样率决定声音频率的范围(相当于音调),可以用数字波形表示。以波形表示的频 率范围通常被称为带宽。要正确理解音频采样可以分为采样的位数和采样的频率。
采样位数 采样精度
采样位数可以理解为采集卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。我们首先要知道:电脑中的声音文件是用数字0和1来 表示的。所以在电脑上录音的本质就是把模拟声音信号转换成数字信号。反之,在播放时则是把数字信号还原成模拟声音信号输出。采集卡的位是指采集卡在采集和 播放声音文件时所使用数字声音信号的二进制位数。采集卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。8位代表2的8次方--256,16 位则代表2的16次方--64K。比较一下,一段相同的音乐信息,16位声卡能把它分为64K个精度单位进行处理,而8位声卡只能处理256个精度单位, 造成了较大的信号损失,最终的采样效果自然是无法相提并论的。
音频采样频率 Fs
数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的,实现这个步骤使用的设备是模/数转换器(A/D)它以每秒上万次的速率对声波进 行采样,每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本。将一串的样本连接起来,就可以描述一段声波了,把每一秒钟所采样的数目称为采样 频率或采率,单位为HZ(赫兹)。采样频率越高所能描述的声波频率就越高。 采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。在当今的主流采集卡上,采样频率一般共分为 22.05KHz、44.1KHz、48KHz三个等级,22.05 KHz只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限,48KHz则更加精确一些。对于高于48KHz的采样频率人耳已无法辨别出 来了,所以在电脑上没有多少使用价值