我想使用 Matlab 中的 App Designer 编写一个简单的音频过滤器应用程序。一个人应该能够加载一个音频文件,按下播放键并在文件播放时更改输入增益、截止频率等参数。
我只是不知道如何使实时更改参数和更新相应的变量成为可能,以便人们可以听到过滤器是如何变化的。
这是我现在写的代码:
classdef EulerFilter < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
CutoffKnobLabel matlab.ui.control.Label
CutoffKnob matlab.ui.control.Knob
PlayButton matlab.ui.control.StateButton
end
properties (Access = public)
inputGain % input Gain
CutoffHz % cutoff frequency in Hz
end
methods (Access = public)
function play(app)
% setup file stream
frameLength = 256;
fileReader = dsp.AudioFileReader(...
'Sun Behind CloudsDry.wav',...
'SamplesPerFrame',frameLength);
deviceWriter = audioDeviceWriter(...
'SampleRate',fileReader.SampleRate);
% code snippet
% porcessing of frames
while ~isDone(fileReader)
% code snippet
end
release(fileReader);
release(deviceWriter);
end
end
methods (Access = private)
% Code that executes after component creation
function startupFcn(app)
app.inputGain = 1;
app.CutoffHz = 22000;
end
% Value changed function: PlayButton
function PlayButtonValueChanged(app, event)
value = app.PlayButton.Value;
play(app);
end
% Value changing function: CutoffKnob
function CutoffKnobValueChanging(app, event)
%display(event)
changingValue = event.Value;
app.CutoffHz = changingValue;
end
end
% App initialization and construction
methods (Access = private)
% Create UIFigure and components
function createComponents(app)
% Create UIFigure
app.UIFigure = uifigure;
app.UIFigure.Position = [100 100 640 480];
app.UIFigure.Name = 'UI Figure';
% Create CutoffKnobLabel
app.CutoffKnobLabel = uilabel(app.UIFigure);
app.CutoffKnobLabel.HorizontalAlignment = 'center';
app.CutoffKnobLabel.Position = [159 322 37 22];
app.CutoffKnobLabel.Text = 'Cutoff';
% Create CutoffKnob
app.CutoffKnob = uiknob(app.UIFigure, 'continuous');
app.CutoffKnob.Limits = [10 22000];
app.CutoffKnob.MajorTicks = [10 1000 5000 22000];
app.CutoffKnob.ValueChangingFcn = createCallbackFcn(app, @CutoffKnobValueChanging, true);
app.CutoffKnob.Position = [155 367 45 45];
app.CutoffKnob.Value = 22000;
% Create PlayButton
app.PlayButton = uibutton(app.UIFigure, 'state');
app.PlayButton.ValueChangedFcn = createCallbackFcn(app, @PlayButtonValueChanged, true);
app.PlayButton.Text = 'Play';
app.PlayButton.Position = [60 40 100 22];
end
end
methods (Access = public)
% Construct app
function app = EulerFilter
% Create and configure components
createComponents(app)
% Register the app with App Designer
registerApp(app, app.UIFigure)
% Execute the startup function
runStartupFcn(app, @startupFcn)
if nargout == 0
clear app
end
end
% Code that executes before app deletion
function delete(app)
% Delete UIFigure when app is deleted
delete(app.UIFigure)
end
end
end
它主要是 Matlab 为 GUI 生成的函数。我添加了一些属性来保存输入增益、截止等的值,以及执行信号处理的 play() 函数。我可以运行应用程序,按下播放按钮并听到正在播放的音频文件,但是当我更改截止频率时,没有任何变化。我猜这是因为我在按下播放按钮时在回调函数中执行了 play() 函数,因此在另一个完成之前无法执行截止旋钮转动时的回调函数。
当我第一次更改参数然后按播放时,一切都正确,除了在文件播放时我无法更改参数。
我尝试了以下方法但没有成功:
- 在 play() 函数的 while 循环内调用回调函数,但我不知道我必须为事件传递什么参数(Matlab 总是告诉我它不知道命令或参数丢失)或者如果这个甚至有用
- 在 runStartupFcn() 中执行 play() 函数,但是这个函数是在显示 GUI 之前执行的,这当然没用
- 据我所知,我无法在其他地方添加功能
所以现在的问题是:我可以让应用程序实时运行吗?
我期待着您的回答!