在Matlab中,如何将音频与绘图同步?

时间:2012-10-10 17:34:10

标签: matlab audio callback playback audio-player

我正在使用[y, Fs, nbits, opts] = wavread(filename)来读取wave文件。接下来我plot(t, y)其中t = 0:1/Fs:(length(y)-1)/Fs。我通过sound(y, Fs)播放wav。我的问题是,有没有办法在情节中显示某种与wav音频同步的标记?我希望听到音频,同时通过在图中移动的标记观察图中的相应声音。

1 个答案:

答案 0 :(得分:1)

以下是具有良好同步的解决方案。这很有效,因为audioplayer对象正在启动更新播放头位置的回调。这是调用脚本。 。 。

fs = 44100;
durT = 3; %seconds
durS = fs*durT; %samples
x = randn(durS, 1);

dt = 1/fs;
tAxis = dt:dt:durT;

frameRate = 25; %fps
frameT = 1/frameRate;

mag = 5;

figure;
plot(tAxis, x);
ylim([-mag mag])
xlim([0 durT])
xlabel('Time [s]')

playHeadLoc = 0;
hold on; ax = plot([playHeadLoc playHeadLoc], [-mag mag], 'r', 'LineWidth', 2);

player = audioplayer(x, fs);
myStruct.playHeadLoc = playHeadLoc;
myStruct.frameT = frameT;
myStruct.ax = ax;

set(player, 'UserData', myStruct);
set(player, 'TimerFcn', @apCallback);
set(player, 'TimerPeriod', frameT);
play(player);

...这里是您可以存储在单独文件中的回调函数......

function src = apCallback(src, eventdata)
    myStruct = get(src, 'UserData'); %//Unwrap

    newPlayHeadLoc = ...
        myStruct.playHeadLoc + ...
        myStruct.frameT;
    set(myStruct.ax, 'Xdata', [newPlayHeadLoc newPlayHeadLoc])

    myStruct.playHeadLoc = newPlayHeadLoc;
    set(src, 'UserData', myStruct); %//Rewrap
end

我刚刚制作了一个噪音样本,你可以用你喜欢的任何东西替换它。遗憾的是,audioplayer对象具有stopresume方法,无法访问当前播放头位置。幸运的是,有一个用户数据属性允许您填写任何您喜欢的内容。