谁知道如何在python中用处理wav文件,并且对他的频谱进行分析的程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁知道如何在python中用处理wav文件,并且对他的频谱进行分析的程序相关的知识,希望对你有一定的参考价值。

参考技术A 1.读取wav文件
# -*- coding: utf-8 -*-
import wave
import pylab as pl
import numpy as np
# 打开WAV文档
f = wave.open(r"c:\WINDOWS\Media\ding.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()

2.观察信号频谱

# -*- coding: utf-8 -*-
import numpy as np
import pylab as pl
sampling_rate = 8000
fft_size = 512
t = np.arange(0, 1.0, 1.0/sampling_rate)
x = np.sin(2*np.pi*156.25*t) + 2*np.sin(2*np.pi*234.375*t)
xs = x[:fft_size]
xf = np.fft.rfft(xs)/fft_size
freqs = np.linspace(0, sampling_rate/2, fft_size/2+1)
xfp = 20*np.log10(np.clip(np.abs(xf), 1e-20, 1e100))
pl.figure(figsize=(8,4))
pl.subplot(211)
pl.plot(t[:fft_size], xs)
pl.xlabel(u"时间(秒)")
pl.title(u"156.25Hz和234.375Hz的波形和频谱")
pl.subplot(212)
pl.plot(freqs, xfp)
pl.xlabel(u"频率(Hz)")
pl.subplots_adjust(hspace=0.4)
pl.show()追问

那如果我想要一个音符的固定频率生成的wav文件,并且把它播放出来,我要怎么写?就是我有了wav文件以后,我还要写写wav的程序吗?还是直接读就可以了,谢谢

在 Python 中用 24 位数据从立体声 wav 文件 wav 中读取单个通道的数据

【中文标题】在 Python 中用 24 位数据从立体声 wav 文件 wav 中读取单个通道的数据【英文标题】:Read the data of a single channel from a stereo wave file wave with 24-bit data in Python 【发布时间】:2016-11-09 12:34:17 【问题描述】:

我想读左声道和右声道。

 import wave
 origAudio = wave.open("6980.wav","r")
 frameRate = origAudio.getframerate()
 nChannels = origAudio.getnchannels()
 sampWidth = origAudio.getsampwidth()
 nbframe=origAudio.getnframes()
 da = np.fromstring(origAudio.readframes(48000), dtype=np.int16)
 origAudio.getparams()

参数

  (2, 3, 48000, 2883584, 'NONE', 'not compressed')

现在我想用 24 位数据的波形文件分离左右声道

【问题讨论】:

【参考方案1】:

您可以使用wavio,这是我编写的一个小模块,用于使用 numpy 数组读取和写入 WAV 文件。在你的情况下:

import wavio

wav = wavio.read("6980.wav")

# wav.data is the numpy array of samples.
# wav.rate is the sampling rate.
# wav.sampwidth is the sample width, in bytes.  For a 24 bit file,
# wav.sampwdith is 3.

left_channel = wav.data[:, 0]
right_channel = wav.data[:, 1]

wavio is on PyPi,源代码在 github 上https://github.com/WarrenWeckesser/wavio。

【讨论】:

感谢它正在工作,但它可以在 16 位中修改 24 位波签名【参考方案2】:

参数告诉您,您有 2 个数据通道,每个样本 3 个字节,频率为 48kHz。因此,当您说readframes(48000) 时,您会得到一秒钟的帧,您可能应该将其读入稍微不同的数据结构:

da = np.fromstring(origAudio.readframes(48000), dtype=np.uint8)

现在你应该有 48000 * 2 * 3 个字节,即len(da)。要仅获取第一个频道,您可以这样做:

chan1 = np.zeros(48000, np.uint32)
chan1bytes = chan1.view(np.uint8)
chan1bytes[0::4] = da[0::6]
chan1bytes[1::4] = da[1::6]
chan1bytes[2::4] = da[2::6]

也就是说,您创建一个整数数组,每个样本一个,然后从源数据中复制适当的字节(您可以尝试直接从readframes() 的结果复制并跳过创建da)。

【讨论】:

谢谢@John Zwing 我要取左右声道数据 @mouridetouba 好的,然后尝试上述解决方案。如果它适用于左声道,你可以对右声道做基本相同的操作,但使用 da[3::6]da[4::6]da[5::6]

以上是关于谁知道如何在python中用处理wav文件,并且对他的频谱进行分析的程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中绘制 Wav 文件视听

谁知道PCM的格式要怎么转换?

如何在MacOS上装MonoDevelop?

有谁知道python中的'Parse_vars'函数是什么?

音频格式文件加密

谁知道怎么用bat打开一个exe并且强制删除这个被打开的exe文件啊。