图形界面创建:使用figure
函数创建名为“声音采样率转换”的图形界面,并设置了其位置和大小。
按钮和文本框:使用uicontrol
函数创建了选择音频文件的按钮、显示当前采样率和目标采样率的文本标签以及用于输入当前采样率和目标采样率的编辑文本框,还有进行采样率转换和播放音频的按钮。
回调函数:定义了选择音频文件、采样率转换和播放音频等按钮点击后的回调函数。这些回调函数负责实际的操作,比如读取音频文件、进行采样率转换和播放音频。
音频处理:使用audioread
函数读取音频文件,resample
函数进行采样率转换,soundsc
函数播放音频。
绘制波形:定义了用于绘制音频波形的函数plotAudioWaveform
,其中使用axes
函数创建坐标系,并使用plot
函数绘制音频波形图。
数据传递:使用setappdata
和getappdata
函数在各个回调函数之间传递音频数据和采样率信息。
function audioConversionGUI()
% 创建图形界面
fig = figure('Name', '声音采样率转换', 'Position', [200, 200, 400, 300]);
% 创建按钮和文本框
uicontrol(fig, 'Style', 'pushbutton', 'String', '选择音频文件', 'Position', [50, 230, 120, 30], 'Callback', @selectAudioFile);
uicontrol(fig, 'Style', 'text', 'String', '当前采样率:', 'Position', [50, 180, 100, 20]);
uicontrol(fig, 'Style', 'text', 'String', '目标采样率:', 'Position', [50, 130, 100, 20]);
uicontrol(fig, 'Style', 'edit', 'Position', [160, 180, 100, 20], 'Tag', 'currentRate');
uicontrol(fig, 'Style', 'edit', 'Position', [160, 130, 100, 20], 'Tag', 'targetRate');
uicontrol(fig, 'Style', 'pushbutton', 'String', '采样率转换', 'Position', [50, 80, 120, 30], 'Callback', @convertSamplingRate);
uicontrol(fig, 'Style', 'pushbutton', 'String', '播放音频', 'Position', [200, 80, 120, 30], 'Callback', @playAudio);
% 选择音频文件回调函数
function selectAudioFile(~, ~)
[filename, pathname] = uigetfile({'*.wav;*.mp3'}, '选择音频文件');
if filename ~= 0
filepath = fullfile(pathname, filename);
[audio, sampleRate] = audioread(filepath);
% 更新当前采样率文本框
currentRateTextBox = findobj(fig, 'Tag', 'currentRate');
set(currentRateTextBox, 'String', num2str(sampleRate));
% 保存音频数据和采样率
setappdata(fig, 'audioData', audio);
setappdata(fig, 'sampleRate', sampleRate);
% 绘制音频波形
plotAudioWaveform(audio, sampleRate);
end
end
% 采样率转换回调函数
function convertSamplingRate(~, ~)
% 获取音频数据和采样率
audio = getappdata(fig, 'audioData');
sampleRate = getappdata(fig, 'sampleRate');
% 获取目标采样率
targetRateTextBox = findobj(fig, 'Tag', 'targetRate');
targetRate = str2double(get(targetRateTextBox, 'String'));
% 进行采样率转换
convertedAudio = resample(audio, targetRate, sampleRate);
% 更新音频数据和采样率
setappdata(fig, 'audioData', convertedAudio);
setappdata(fig, 'sampleRate', targetRate);
% 绘制音频波形
plotAudioWaveform(convertedAudio, targetRate);
end
% 播放音频回调函数
function playAudio(~, ~)
% 获取音频数据和采样率
audio = getappdata(fig, 'audioData');
sampleRate = getappdata(fig, 'sampleRate');
% 播放音频
soundsc(audio, sampleRate);
end
% 绘制音频波形
function plotAudioWaveform(audio, sampleRate)
axes('Parent', fig, 'Units', 'pixels', 'Position', [50, 20, 300, 50]);
t = (0:length(audio)-1) / sampleRate;
plot(t, audio);
xlabel('时间 (秒)');
ylabel('幅度');
title('音频波形');
end
end