1 简介
音频是多媒体中的一种重要媒体。我们能够听见的音频信号的频率范围大约是20Hz-2OkHz,其中语音大约分布在300Hz-4kHz之内,而音乐和其他自然声响是全范围分布的。声音经过模拟设备记录或再生,成为模拟音频,再经数字化成为数字音频。通过对常用数字滤波器的设计和实现,掌握数字信号处理的工作原理及设计方法。
利用已经学过的数字信号处理的知识,设计一数字调音台实现以下功能:
1) 通过菜单选择待处理的歌曲;
2) 实时显示处理前的信号时域波形文件,能够对波形文件进行缩放显示;
3) 实时显示处理前的信号频谱,采用柱状显示,类似于音乐播放器软件上的频谱显示;
4) 采用常见的低通、高通、带通、带阻(50Hz)滤波器对信号进行滤波,滤波器阶数可调,带宽可调,观察处理后的信号频谱的变化;
5) 通过扬声器播放处理过的信号,听信号有什么变化;
6) 编制 GUI 用户界面,在用户界面上实现上述所有功能。
7) 实现数字均衡器的功能。
2 部分代码
function varargout = ClassDesign(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @ClassDesign_OpeningFcn, ...
                   'gui_OutputFcn',  @ClassDesign_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
function ClassDesign_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
global timerPeriod timerFPeriod timerDEPeriod
timerPeriod=0.1;
timerFPeriod=0.2;
timerDEPeriod=timerPeriod;
handles.pTimer=timer;
set(handles.pTimer, 'ExecutionMode', 'FixedRate');
set(handles.pTimer, 'Period', timerPeriod); 
set(handles.pTimer, 'TimerFcn', {@showWave, handles}); 
handles.afTimer=timer;
set(handles.afTimer, 'ExecutionMode', 'FixedRate');
set(handles.afTimer, 'Period', timerFPeriod); 
set(handles.afTimer, 'TimerFcn', {@showFilterdWave, handles}); 
handles.deTimer=timer;
set(handles.deTimer, 'ExecutionMode', 'FixedRate');
set(handles.deTimer, 'Period', timerDEPeriod); 
set(handles.deTimer, 'TimerFcn', {@showDEWave, handles}); 
global STOP
global PAUSE
global PLAY
STOP=0;
PAUSE=1;
PLAY=2;
global playPnt playFPnt
playPnt=1;
playFPnt=1;
global filterState deState
filterState=0;
deState=0;
guidata(hObject, handles);
function varargout = ClassDesign_OutputFcn(hObject, eventdata, handles) 
varargout{1} = handles.output;
function openFileButton_CreateFcn(hObject, eventdata, handles)
function openFileButton_Callback(hObject, eventdata, handles)   
global PAUSE playState playFState STOP
global timerPeriod timerFPeriod
global frameNum fftFrame Frame
global NframeNum NFrame NfftFrame
global N NFFT FS NN NNFFT
global A DATA maxData
global fileName filePath FILE
A=1;
cd('music');
[fileName, filePath, ~] = uigetfile({'*.mp3';'*.wav';'*.mp4'}, 'Select Music File');
cd('..');
if fileName ~= 0 
    set(handles.deFilterMode, 'enable', 'on');
    set(handles.playButton, 'enable', 'on');
    set(handles.resetButton, 'enable', 'on');
    set(handles.playFButton, 'enable', 'off');
    set(handles.resetFButton, 'enable', 'off');
    FILE = [filePath fileName];
    set(handles.fileNameDisp, 'string', FILE);
    [DATA, FS] = audioread(FILE);
    DATA=DATA(:,1); 
    N=FS*timerPeriod;
    NN=FS*timerFPeriod;
    NFFT = 2^nextpow2(N);
    NNFFT = 2^nextpow2(NN);
    L=size(DATA, 1);
    r=mod(L,N);
    maxData  = max(DATA);
    frameNum = ceil(L/N);
    Frame    = zeros(N, frameNum); 
    fftFrame = zeros(N, frameNum);
    Nr=mod(L,NN);
    NframeNum = ceil(L/NN);
    NFrame    = zeros(NN, NframeNum); 
    NfftFrame = zeros(NN, NframeNum);
    for i=1:frameNum
        if i==frameNum
            Frame(:,i)=[DATA((L-r)+1:L); zeros(frameNum*N-L,1)];
        else
            Frame(:,i)=DATA(((i-1)*N+1):N*i);
        end
        fftFrame(:,i)=abs(fft(Frame(:,i))/max(fft(Frame(:,i))));
    end
    for i=1:NframeNum
        if i==NframeNum
            NFrame(:,i)=[DATA((L-Nr)+1:L); zeros(NframeNum*NN-L,1)];
        else
            NFrame(:,i)=DATA(((i-1)*NN+1):NN*i);
        end
        NfftFrame(:,i)=abs(fft(NFrame(:,i))/max(fft(NFrame(:,i))));
    end
    playState=PAUSE;
    playFState=STOP;
end3 仿真结果

4 参考文献
[1]曹建玲, 刘焕淋, 雷宏江. 基于MATLAB的“数字信号处理”仿真实验[J]. 中国电力教育:中, 2012.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。











