1 简介 音频是多媒体中的一种重要媒体。我们能够听见的音频信号的频率范围大约是20Hz-2OkHz,其中语音大约分布在300Hz-4kHz之内,而音乐和其他自然声响是全范围分布的。声音经过模拟
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 仿真结果
4 参考文献
[1]曹建玲, 刘焕淋, 雷宏江. 基于MATLAB的“数字信号处理”仿真实验[J]. 中国电力教育:中, 2012.