复现听力实验时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灵活度更高,实现逻辑如下:
- 初始化阶段预创建绘图对象,避免每次重绘消耗性能
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','骨传导相位调整');
- 每帧更新时仅修改线条的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
相关产品推荐
相关产品推荐

