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;
end

3 仿真结果

【信号处理】数字调音台含Matlab源码_数字信号处理

4 参考文献

[1]曹建玲, 刘焕淋, 雷宏江. 基于MATLAB的“数字信号处理”仿真实验[J]. 中国电力教育:中, 2012.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

【信号处理】数字调音台含Matlab源码_用户界面_02