添加链接描述在这里插入代码片
**
Python 音频信号处理
话不多说上代码
import ui_AudioEffects
from ui_AudioEffects import Ui_AudioEffects
from PyQt4 import QtCore, QtGui
from PyQt4.Qt import QApplication, SIGNAL, QFileDialog, QIcon,QWidget
from PyQt4 import phonon
from PyQt4.phonon import Phonon
#from mpl_pyqt4_widget import MPL_Widget
import numpy as np
import wave
import scipy.signal as signal
import os, sys
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Player(QtGui.QMainWindow):
def __init__(self,parent=None):
QWidget.__init__(self)
Ui_AudioEffects.__init__(self)
self.mediaSource = None
self.audioPath = ''
self.file = ''
self.ui = Ui_AudioEffects
self.t = []
self.sources = []
self.i=1
self.j=1
self.k=1
self.temp="temp.wav"
self.flag=0
self.mediaObj = phonon.Phonon.MediaObject(self)
self.audioSink = Phonon.AudioOutput(Phonon.MusicCategory, self)
self.audioPath = Phonon.createPath(self.mediaObj, self.audioSink)
self._createUI()
self._connect()
self.show()
def _createUI(self):
self.ui = ui_AudioEffects.Ui_AudioEffects()
self.ui.setupUi(self)
self.ui.retranslateUi(self)
#将按钮转换为图片
self.playIcon= QIcon("play.png")
self.pauseIcon= QIcon("pause.png")
stopIcon= QIcon("stop.png")
musicIcon=QIcon("music.png")
self.setWindowIcon(musicIcon)
self.ui.playToolButton.setIcon(self.playIcon)
self.ui.stopToolButton.setIcon(stopIcon)
#激活进度条和声音
self.ui.seekSlider.setMediaObject(self.mediaObj)
self.ui.volumeSlider.setAudioOutput(self.audioSink)
#将幅度和频谱框背景置黑
self.ui.plotWidget.canvas.ax.patch.set_facecolor("black")
self.ui.plotWidget_2.canvas.ax.patch.set_facecolor("black")
#打开文件前禁用某些功能
self.ui.playToolButton.setEnabled(False)
self.ui.stopToolButton.setEnabled(False)
self.ui.actionWavesReverb.setEnabled(False)
self.ui.actionLowPassFilter.setEnabled(False)
self.ui.actionEcho.setEnabled(False)
#创建信号槽事件
def _connect(self):
#打开文件
self.connect(self.ui.fileOpenAction,SIGNAL("triggered()"),self.openFileDialog)
#关闭窗体
self.connect(self.ui.fileExitAction,SIGNAL("triggered()"),self.close)
#改变音效
self.connect(self.ui.actionWavesReverb,SIGNAL("triggered()"),self.reverbEffect)
self.connect(self.ui.actionEcho,SIGNAL("triggered()"),self.echoEffect)
self.connect(self.ui.actionLowPassFilter,SIGNAL("triggered()"),self.lpEffect)
#播放、暂停音乐
self.connect(self.ui.playToolButton,SIGNAL("clicked()"),self.playMedia)
#停止音乐
self.connect(self.ui.stopToolButton,SIGNAL("clicked()"),self.stopMedia)
#打开文件
def openFileDialog(self):
self.file = ''
self.file = \
str(QFileDialog.getOpenFileName(
self,
"Open Audio File","/video",
"wav(*.wav);;"))
if self.file!='':
#打开文件后清除checked信息
self.ui.actionLowPassFilter.setChecked(False)
self.ui.actionWavesReverb.setChecked(False)
self.ui.actionEcho.setChecked(False)
#打开文件后使能check功能
self.ui.actionWavesReverb.setEnabled(True)
self.ui.actionLowPassFilter.setEnabled(True)
self.ui.actionEcho.setEnabled(True)
self.ui.actionWavesReverb.setCheckable(True)
self.ui.actionLowPassFilter.setCheckable(True)
self.ui.actionEcho.setCheckable(True)
#使能playToolButton
self.ui.playToolButton.setEnabled(True)
self.ui.stopToolButton.setEnabled(True)
self.flag=1
self.readMediaData()
self.abs_fft_y=self.fftData(self.y,self.nframes,self.framerate)
self.plotMediaData(self.y[0],self.abs_fft_y[0])
self.p = 1
self.loadNewMedia()
#缓存新歌
def loadNewMedia(self):
if self.mediaSource:
self.stopMedia()
del self.mediaSource
self.mediaSource = phonon.Phonon.MediaSource(self.file)
self.mediaObj.setCurrentSource(self.mediaSource)
self.ui.playToolButton.setIcon(self.playIcon)
#播放音乐
def playMedia(self):
if self.mediaObj is None:
print ("Error playing Audio")
return
if self.p == 1:
self.p=0
self.mediaObj.play()
self.ui.playToolButton.setIcon(self.pauseIcon)
else:
self.pauseMedia()
self.p = 1
self.ui.playToolButton.setIcon(self.playIcon)
#停止播放
def stopMedia(self):
self.p=1
self.mediaObj.stop()
self.ui.playToolButton.setIcon(self.playIcon)
#暂停播放
def pauseMedia(self):
self.mediaObj.pause()
def readMediaData(self):
f = wave.open(self.file, 'rb')
self.nchannels,self.sampwidth,self.framerate,self.nframes,self.comptype, self.compname=f.getparams()
str_y=f.readframes(self.nframes)
f.close()
y=np.fromstring(str_y,dtype=np.short)
y.shape = -1,self.nchannels
self.y=y.T
def fftData(self,y,nframes,framerate):
#计算信号的频谱
fft_y=np.fft.fft(y)/nframes
abs_fft_y = np.abs(fft_y)
return abs_fft_y
def plotMediaData(self,y,abs_fft_y):
#绘图
self.ui.plotWidget.canvas.ax.clear()
self.ui.plotWidget.canvas.ax.patch.set_facecolor("black")
self.ui.plotWidget.canvas.ax.plot(y,'-b')
self.ui.plotWidget.canvas.draw()
self.ui.plotWidget_2.canvas.ax.clear()
self.ui.plotWidget_2.canvas.ax.patch.set_facecolor("black")
self.ui.plotWidget_2.canvas.ax.plot(abs_fft_y,'-b')
self.ui.plotWidget_2.canvas.draw()
def reverbEffect(self):
if self.flag==1:
self.loadNewMedia()
self.i=self.i+1
self.stopMedia()
self.ui.actionEcho.setChecked(False)
self.ui.actionLowPassFilter.setChecked(False)
if self.ui.actionWavesReverb.isChecked()==True:
t1=0.4
t2=0.5
t3=0.6
count1=t1*self.framerate
count2=t2*self.framerate
count3=t3*self.framerate
Count=self.nframes+count3
a1=0.5
a2=0.4
a3=0.3
y1=np.append(self.y,np.zeros(count3))
y2=np.append(np.zeros(count1),self.y)
y2=np.append(y2,np.zeros(count3-count1))
y3=np.append(np.zeros(count2),self.y)
y3=np.append(y3,np.zeros(count3-count2))
y4=np.append(np.zeros(count3),self.y)
y_reverb=y1+a1*y2+a2*y3+a3*y4
abs_fft_y_reverb=self.fftData(y_reverb,Count,self.framerate)
self.plotMediaData(y_reverb,abs_fft_y_reverb)
self.saveData(y_reverb,Count,self.nchannels,self.sampwidth,self.framerate,self.comptype,self.compname)
self.loadEffectsMedia()
else:
self.plotMediaData(self.y[0],self.abs_fft_y[0])
self.loadNewMedia()
def echoEffect(self):
if self.flag==1:
self.loadNewMedia()
self.stopMedia()
self.ui.actionLowPassFilter.setChecked(False)
self.ui.actionWavesReverb.setChecked(False)
if self.ui.actionEcho.isChecked()==True:
alpha=0.6
t=0.5
count=t*self.framerate
Count=count+self.nframes
zero=np.zeros(count)
y1=np.append(self.y,zero)
y2=np.append(zero,self.y)
y_echo=y1+alpha*y2
abs_fft_y_echo=self.fftData(y_echo,Count,self.framerate)
self.plotMediaData(y_echo,abs_fft_y_echo)
self.saveData(y_echo,Count,self.nchannels,self.sampwidth,self.framerate,self.comptype,self.compname)
self.loadEffectsMedia()
else:
self.plotMediaData(self.y[0],self.abs_fft_y[0])
self.loadNewMedia()
def lpEffect(self):
if self.flag==1:
self.loadNewMedia()
self.stopMedia()
self.ui.actionEcho.setChecked(False)
self.ui.actionWavesReverb.setChecked(False)
if self.ui.actionLowPassFilter.isChecked()==True:
b= signal.remez(201, (0, 0.1, 0.12, 0.50), (1, 0.01))
y_lp=signal.lfilter(b,1,self.y)
abs_fft_y_lp=self.fftData(y_lp,self.nframes,self.framerate)
self.plotMediaData(y_lp[0],abs_fft_y_lp[0])
self.saveData(y_lp,self.nframes,self.nchannels,self.sampwidth,self.framerate,self.comptype,self.compname)
self.loadEffectsMedia()
else:
self.plotMediaData(self.y[0],self.abs_fft_y[0])
self.loadNewMedia()
#保存音效数据
def saveData(self,data,nframes,nchannels,sampwidth,framerate,comptype,compname):
wave_data = data.astype(np.short)
# 打开WAV文档
f = wave.open("temp.wav", "wb")
# 配置声道数、量化位数和取样频率
f.setparams((nchannels, sampwidth, framerate, nframes, comptype, compname))
# 将wav_data转换为二进制数据写入文件
f.writeframes(wave_data.tostring())
f.close()
#为音频播放插件加载处理后的音效数据
def loadEffectsMedia(self):
if self.mediaSource:
del self.mediaSource
self.mediaSource = phonon.Phonon.MediaSource(self.temp)
self.mediaObj.setCurrentSource(self.mediaSource)
app = QApplication(sys.argv)
musicPlayer = Player()
app.exec_()
#程序退出时删除产生的临时文件“temp.wav”
s=os.getcwd()
s=s+"\\"+"temp.wav"
os.remove(s)
#sys.exit(app.exec_())
**
## UI
**
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_AudioEffects(object):
def setupUi(self, AudioEffects):
AudioEffects.setObjectName(_fromUtf8("AudioEffects"))
AudioEffects.resize(600, 370)
AudioEffects.setMinimumSize(QtCore.QSize(600, 370))
AudioEffects.setMaximumSize(QtCore.QSize(600, 370))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(_fromUtf8("music/Music.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
AudioEffects.setWindowIcon(icon)
self.centralwidget = QtGui.QWidget(AudioEffects)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.plotWidget = MPL_Widget(self.centralwidget)
self.plotWidget.setGeometry(QtCore.QRect(0, 10, 601, 131))
self.plotWidget.setStyleSheet(_fromUtf8(""))
self.plotWidget.setObjectName(_fromUtf8("plotWidget"))
self.seekSlider = phonon.Phonon.SeekSlider(self.centralwidget)
self.seekSlider.setGeometry(QtCore.QRect(10, 270, 581, 22))
self.seekSlider.setLayoutDirection(QtCore.Qt.LeftToRight)
self.seekSlider.setAutoFillBackground(False)
self.seekSlider.setIconVisible(False)
self.seekSlider.setOrientation(QtCore.Qt.Horizontal)
self.seekSlider.setObjectName(_fromUtf8("seekSlider"))
self.horizontalLayoutWidget = QtGui.QWidget(self.centralwidget)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 291, 91, 41))
self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget"))
self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setMargin(0)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.playToolButton = QtGui.QToolButton(self.horizontalLayoutWidget)
self.playToolButton.setMinimumSize(QtCore.QSize(30, 30))
self.playToolButton.setText(_fromUtf8(""))
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap(_fromUtf8("music/Play.png")), QtGui.QIcon.Normal, QtGui.QIcon.On)
self.playToolButton.setIcon(icon1)
self.playToolButton.setObjectName(_fromUtf8("playToolButton"))
self.horizontalLayout.addWidget(self.playToolButton)
self.stopToolButton = QtGui.QToolButton(self.horizontalLayoutWidget)
self.stopToolButton.setMinimumSize(QtCore.QSize(30, 30))
self.stopToolButton.setText(_fromUtf8(""))
icon2 = QtGui.QIcon()
icon2.addPixmap(QtGui.QPixmap(_fromUtf8("music/Stop.png")), QtGui.QIcon.Normal, QtGui.QIcon.On)
self.stopToolButton.setIcon(icon2)
self.stopToolButton.setObjectName(_fromUtf8("stopToolButton"))
self.horizontalLayout.addWidget(self.stopToolButton)
self.volumeSlider = phonon.Phonon.VolumeSlider(self.centralwidget)
self.volumeSlider.setGeometry(QtCore.QRect(420, 310, 161, 22))
self.volumeSlider.setObjectName(_fromUtf8("volumeSlider"))
self.plotWidget_2 = MPL_Widget(self.centralwidget)
self.plotWidget_2.setGeometry(QtCore.QRect(0, 140, 601, 131))
self.plotWidget_2.setStyleSheet(_fromUtf8(""))
self.plotWidget_2.setObjectName(_fromUtf8("plotWidget_2"))
AudioEffects.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(AudioEffects)
self.menubar.setGeometry(QtCore.QRect(0, 0, 600, 25))
self.menubar.setMinimumSize(QtCore.QSize(0, 25))
font = QtGui.QFont()
font.setPointSize(10)
self.menubar.setFont(font)
self.menubar.setObjectName(_fromUtf8("menubar"))
self.menuFile = QtGui.QMenu(self.menubar)
self.menuFile.setObjectName(_fromUtf8("menuFile"))
self.menuAudioEffects = QtGui.QMenu(self.menubar)
self.menuAudioEffects.setObjectName(_fromUtf8("menuAudioEffects"))
AudioEffects.setMenuBar(self.menubar)
self.fileOpenAction = QtGui.QAction(AudioEffects)
self.fileOpenAction.setObjectName(_fromUtf8("fileOpenAction"))
self.fileExitAction = QtGui.QAction(AudioEffects)
self.fileExitAction.setObjectName(_fromUtf8("fileExitAction"))
self.actionWavesReverb = QtGui.QAction(AudioEffects)
#self.actionWavesReverb.setCheckable(False)
self.actionWavesReverb.setObjectName(_fromUtf8("actionWavesReverb"))
self.actionLowPassFilter = QtGui.QAction(AudioEffects)
self.actionLowPassFilter.setObjectName(_fromUtf8("actionLowFilter"))
#self.actionLowPassFilter.setCheckable(False)
self.actionEcho = QtGui.QAction(AudioEffects)
self.actionEcho.setObjectName(_fromUtf8("actionEcho"))
#self.actionEcho.setCheckable(False)
self.menuFile.addAction(self.fileOpenAction)
self.menuFile.addAction(self.fileExitAction)
self.menuAudioEffects.addAction(self.actionWavesReverb)
self.menuAudioEffects.addAction(self.actionLowPassFilter)
self.menuAudioEffects.addAction(self.actionEcho)
self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuAudioEffects.menuAction())
self.retranslateUi(AudioEffects)
QtCore.QMetaObject.connectSlotsByName(AudioEffects)
def retranslateUi(self, AudioEffects):
AudioEffects.setWindowTitle(_translate("AudioEffects", "AudioEffects", None))
self.stopToolButton.setToolTip(_translate("AudioEffects", "<html><head/><body><p>停止</p></body></html>", None))
self.menuFile.setTitle(_translate("AudioEffects", "&File", None))
self.menuAudioEffects.setTitle(_translate("AudioEffects", "&Effects", None))
self.fileOpenAction.setText(_translate("AudioEffects", "Open", None))
self.fileOpenAction.setShortcut(_translate("AudioEffects", "Ctrl+P", None))
self.fileExitAction.setText(_translate("AudioEffects", "Exit", None))
self.fileExitAction.setShortcut(_translate("AudioEffects", "Ctrl+E", None))
self.actionWavesReverb.setText(_translate("AudioEffects", "WavesReverb", None))
self.actionLowPassFilter.setText(_translate("AudioEffects", "LowPassFilter", None))
self.actionEcho.setText(_translate("AudioEffects", "Echo", None))
from PyQt4 import phonon
from mpl_pyqt4_widget import MPL_Widget
在这里插入代码片