【问题标题】:Reading an audio file through Matlab GUI通过 Matlab GUI 读取音频文件
【发布时间】:2014-02-03 10:22:51
【问题描述】:

我想在 matlab 中制作一个有 2 个按钮的 GUI。 1 个按钮 (pushbutton1) 加载所选文件,第二个按钮 (pushbutton2) 执行代码。 这就是我目前所拥有的

% --- 在按钮 1 中按下按钮时执行。函数 pushbutton1_Callback(hObject, ventdata, 句柄) % hObject 到 pushbutton1 的句柄(见 GCBO) % eventdata reserved - 将在未来版本的 MATLAB 中定义 % 使用句柄和用户数据处理结构(参见 GUIDATA) [文件名路径名] = uigetfile({'*.wav'}, '选择文件'); fullpathname = strcat(路径名,文件名); 音频= wavread(全路径名); % --- 在 pushbutton2.function pushbutton2_Callback(hObject, eventdata, handles) 中按下按钮时执行 % hObject 到 pushbutton2 的句柄(见 GCBO) % eventdata reserved - 将在未来版本的 MATLAB 中定义 % 使用句柄和用户数据处理结构(参见 GUIDATA) % 得到一段元音 [x,fs]=wavread('音频',[24120 25930]); ms20=fs/50; 50Hz 时的 % 最小语音 Fx % 绘制波形 t=(0:长度(x)-1)/fs;采样时刻的 % 次 子图(2,1,1); 情节(t,x); 图例('波形'); xlabel('时间(s)'); ylabel('幅度');

错误在下面一行

[x,fs]=wavread('音频',[24120 25930]);

我应该怎么写?

另外,在绘图时如何使绘图出现在 GUI 上?

【问题讨论】:

  • 我认为您可能需要在文件名中包含 .wav 扩展名。此外,当您创建 GUI 时,您将创建一个图形窗口,因此只需使用 axes 命令向其中添加一个轴,然后绘图就会出现在其中。

标签: matlab matlab-guide


【解决方案1】:

wavread 将文件名作为第一个参数。由于audio 不是您当前路径中的文件(或者可能不是您想要的文件),因此您不能将其作为第一个参数。

但变量audio 保存了信号本身,因此您不再需要访问文件本身。然后,同时初始化fs

[audio,fs] = wavread(fullpathname);

然后,如果您需要获取信号的一部分,只需获取一部分即可:

x = audio(24120 25930);

对于绘图,在您的 GUI 中添加轴并调用 plot 并将这些轴的句柄作为第一个参数(Matlab 的文档中充满了这样的示例:))。

【讨论】:

  • @user3171222 Oups,我用[] 代替() 来选择切片。编辑我的答案。
【解决方案2】:

[数据,fs] = wavread(文件名);

x = 数据(24120:25930);

% 绘制数据

情节(handles.axes1,t,x);

%%假设您没有将句柄的名称更改为轴

【讨论】:

    【解决方案3】:

    我尝试了你的建议,我是这样写的:

    % --- 在按钮 1 中按下按钮时执行。 函数 pushbutton1_Callback(hObject, eventdata, 句柄) % hObject 到 pushbutton1 的句柄(见 GCBO) % eventdata reserved - 将在未来版本的 MATLAB 中定义 % 使用句柄和用户数据处理结构(参见 GUIDATA) [文件名路径名] = uigetfile({'*.wav'}, '选择文件'); fullpathname = strcat(路径名,文件名); [数据,fs] = wavread(文件名); % --- 在按钮 2 中按下按钮时执行。 函数 pushbutton2_Callback(hObject, eventdata, 句柄) % hObject 到 pushbutton2 的句柄(见 GCBO) % eventdata reserved - 将在未来版本的 MATLAB 中定义 % 使用句柄和用户数据处理结构(参见 GUIDATA) %模型 % 得到一段元音 x = 数据(24120:25930); ms20=fs/50; 50Hz 时的 % 最小语音 Fx % % 绘制波形 t=(0:长度(x)-1)/fs;采样时刻的 % 次 子图(2,1,1); 情节(t,x); 图例('波形'); xlabel('时间(s)'); ylabel('幅度'); 情节(handles.axes1,t,x); % % 计算自相关 r=xcorr(x,ms20,'coeff'); % % 绘图自相关 d=(-ms20:ms20)/fs; % 次延迟 子图(2,1,2); 情节(d,r); 图例('自相关'); xlabel('延迟(s)'); ylabel('相关系数'); 情节(handles.axes2,d,r); ms2=fs/500 % 500Hz 时的最大语音 Fx ms20=fs/50 % 50Hz 时的最小语音 Fx % 只看对应于正延迟的区域 r=r(ms20+1:2*ms20+1) [rmax,tx]=max(r(ms2:ms20)) fprintf('rmax=%g Fx=%GHz\n',rmax,fs/(ms2+tx-1));

    但我得到以下错误:

    ?? “double”类型的输入参数的未定义函数或方法“data”。 ==> untitled>pushbutton2_Callback 中的错误在 94 x = 数据(24120:25930); ==> gui_mainfcn 中的错误为 96 feval(varargin{:}); ==> 中的错误在 42 处未命名 gui_mainfcn(gui_State, varargin{:}); ==> @(hObject,eventdata)untitled('pushbutton2_Callback',hObject,eventdata,guidata(hObject)) 中的错误 ???评估 uicontrol 回调时出错

    【讨论】:

    • 变量data是函数function pushbutton1_Callback的局部变量,所以在函数function pushbutton2_Callback中是不可见的。将其存储在用户数据的句柄中以将其传递给函数。
    • 你能告诉我怎么做吗? matlab让我困惑:(
    • 我认为您可以从阅读 guidata 的 Matlab 文档开始,因为它是在代码的自动注释生成中温和地提出的 :)
    • 好的,我想我明白了..我将数据和 fs 定义为全局并使用它们..谢谢:*
    【解决方案4】:

    你的问题在于变量 ure 让 wavread 读取,而不是 [data,fs] = wavread(filename); use:[data,fs] = wavread(fullpathname)。它对我有用。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2013-11-30
      • 2014-09-20
      • 1970-01-01
      相关资源
      最近更新 更多