You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复现听力实验时MATLAB如何实时调整播放中正弦波相位并可视化?

MATLAB 实验实现方案

相位调整实现

你当前设计的相位调整方案不可行:两个相位差2π的正弦波是完全同相的,乘以不同系数相加后本质是调整振幅,不会改变输出信号的相位,也无法实现反相抵消的效果,还会额外引入振幅变化的干扰。
由于dsp.SineWave的phase属性为不可调,推荐两种成熟的替代方案:

  • 手动生成正弦波样本:放弃使用正弦波系统对象,按帧生成信号时直接引入可调相位参数,无畸变且逻辑简单:
% 初始化参数
fs = 48000; % 采样率
freq = 1000; % 测试频率
phase_air = 0; % 空气传导固定相位
phase_bone = 0; % 骨传导可调相位
current_time = 0;
frame_dur = 0.05; % 每帧时长50ms
frame_len = round(fs * frame_dur);

% 每帧生成逻辑
t = (0:frame_len-1)/fs + current_time;
sig_air = sin(2*pi*freq*t + phase_air);
sig_bone = sin(2*pi*freq*t + phase_bone);
current_time = current_time + frame_dur;

直接修改phase_bone的取值即可实现0~2π范围内的连续相位调整,完全没有信号畸变。

  • 正交信号合成方案:如果必须使用系统对象,可创建两个相位差π/2的正弦波对象,利用和角公式合成任意相位的信号:
% 初始化两个正交系统对象
sine0 = dsp.SineWave('SampleRate',fs,'Frequency',freq,'Phase',0);
sine90 = dsp.SineWave('SampleRate',fs,'Frequency',freq,'Phase',pi/2);

% 合成任意相位θ的信号
sig_bone = sin(theta) * sine0() + cos(theta) * sine90();

实时可视化实现

dsp.TimeScope只能在脚本停止后更新的问题是缺少强制渲染指令,MATLAB默认会批量缓存绘图指令,在每帧绘制后添加drawnow limitrate即可强制实时刷新。
你提到的用plot函数实现实时可视化的方案完全可行,且比dsp.TimeScope灵活度更高,实现逻辑如下:

  1. 初始化阶段预创建绘图对象,避免每次重绘消耗性能
figure('Position',[100,100,800,400])
% 预生成三个信号的线条对象
t_plot = (0:frame_len-1)/fs*1000; % 横轴转毫秒方便查看
h_air = plot(t_plot, zeros(frame_len,1), 'b', 'LineWidth',1, 'DisplayName','空气传导信号');
hold on; grid on;
h_bone = plot(t_plot, zeros(frame_len,1), 'r', 'LineWidth',1, 'DisplayName','骨传导信号');
h_sum = plot(t_plot, zeros(frame_len,1), 'k', 'LineWidth',1.5, 'DisplayName','叠加后信号');
hold off;
xlabel('时间(ms)'); ylabel('振幅');
ylim([-2.2 2.2]); legend('Location','best');

% 添加相位调节滑块,无需命令行输入,操作更便捷
h_slider = uicontrol('Style','slider','Min',0,'Max',2*pi,'Value',0,...
    'Position',[100,20,600,30], 'String','骨传导相位调整');
  1. 每帧更新时仅修改线条的Y数据,调用drawnow刷新界面
% 每帧更新逻辑
phase_bone = get(h_slider,'Value');
% [这里插入生成sig_air、sig_bone的代码]
sig_sum = sig_air + sig_bone;

set(h_air, 'YData', sig_air);
set(h_bone, 'YData', sig_bone);
set(h_sum, 'YData', sig_sum);
drawnow limitrate; % 限制最高刷新率为20帧/秒,避免界面卡顿

播放音频可使用audioDeviceWriter系统对象,每帧生成信号后同步调用写入即可实现音画同步。

内容的提问来源于stack exchange,提问作者m-ga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:15:06