(新手求助)项目内容:通过simulink(mat function)来实现多麦克风间喇叭信号的时延计算

在下新手,刚开始接触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

但得到的结果总是有问题,求哪位大佬指点一二(感谢!!)

对了,以下是整体仿真框架。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值