在下新手,刚开始接触simulink,通过simulink(mat function)来实现多麦克风间喇叭信号的时延计算,主要思路是通过audio device reader输入笔记本自带的麦克风阵列(设置为双通道)
所得信号为两列矩阵,因此分开为两个声道
代码如下:
function [signal1, signal2] = split_audio(audio)
signal1 = audio(:,1); % 取第一列(左声道)
signal2 = audio(:,2); % 取第二列(右声道)
end
在滤波(50Hz-5KHz以及幅度过滤)之后
function filtered_signal1 = noiseFilter(signal1, fs)
% 带通滤波
low_freq = 50;
high_freq = 5000;
[b, a] = butter(4, [low_freq high_freq] / (fs / 2), 'bandpass');
filtered_signal1 = filter(b, a, signal1);
% 频域自适应谱减法
frame_size = 1024;
overlap = 512;
num_frames = floor((length(filtered_signal1) - frame_size) / overlap) + 1;
for i = 1:num_frames
start_idx = (i - 1) * overlap + 1;
end_idx = min(start_idx + frame_size - 1, length(filtered_signal1));
frame = filtered_signal1(start_idx:end_idx);
frame_fft = fft(frame, frame_size);
magnitude = abs(frame_fft);
phase = angle(frame_fft);
% 计算动态噪声阈值,使用软门限
avg_magnitude = mean(magnitude);
noise_threshold = 1.5 * std(magnitude);
magnitude = max(magnitude - noise_threshold, 0);
frame_filtered_fft = magnitude .* exp(1j * phase);
frame_filtered_signal = ifft(frame_filtered_fft);
end
end
通过互相关求时延的方法进行计算时延
function time_delay = cross_correlation_delay(filtered_signal1, filtered_signal2, fs)
% 计算互相关
[acor, lag] = xcorr(filtered_signal1, filtered_signal2);
[~, I] = max(acor);
sample_delay = lag(I);
time_delay = sample_delay / fs;
end
但得到的结果总是有问题,求哪位大佬指点一二(感谢!!)。
对了,以下是整体仿真框架。