Python 音频信号处理

添加链接描述在这里插入代码片**

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", "

停止

", 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
在这里插入代码片

你可能感兴趣的:(python)