matlab 将原声音频的第3-4个零点当作一段,并记录这两个零点的横坐标,分别叠加自身1次、2次、3次,用刚刚的横坐标分别截取1次、2次、3次的音频段,把他们与原声的音频段进行短时能量比较,筛选出最高的音频段
时间: 2024-01-21 16:20:01 浏览: 20
以下是实现这个功能的MATLAB代码:
```matlab
% 读取原声音频文件
[y, Fs] = audioread('original_audio.wav');
% 找到第3和第4个零点
zero_crossings = diff(sign(y));
zero_crossings(zero_crossings > 0) = 0;
zero_crossings = abs(zero_crossings);
zero_indices = find(zero_crossings);
% 将第3和第4个零点之间的音频段分别叠加自身1次、2次、3次
seg_start = zero_indices(3) + 1;
seg_end = zero_indices(4) - 1;
seg = y(seg_start:seg_end);
seg_len = length(seg);
seg_1 = seg + [zeros(1,seg_len-1) seg(1)];
seg_2 = seg_1 + [zeros(1,seg_len-1) seg_1(1)] + [zeros(1,seg_len*2-1) seg_1(1)];
seg_3 = seg_2 + [zeros(1,seg_len-1) seg_2(1)] + [zeros(1,seg_len*2-1) seg_2(1)] + [zeros(1,seg_len*3-1) seg_2(1)];
% 找到每个叠加后的音频段中1次、2次、3次的起始和结束位置
seg_1_start = seg_start;
seg_1_end = seg_1_start + seg_len - 1;
seg_2_start = seg_1_end + 1;
seg_2_end = seg_2_start + seg_len*2 - 1;
seg_3_start = seg_2_end + 1;
seg_3_end = seg_3_start + seg_len*3 - 1;
% 计算每个音频段的短时能量
win_len = round(0.02 * Fs); % 窗口长度为20ms
step_len = round(0.01 * Fs); % 步长为10ms
n_fft = 2^nextpow2(win_len);
[S, F, T] = spectrogram(y, win_len, win_len-step_len, n_fft, Fs);
power = abs(S).^2;
energy = sum(power, 1);
seg_1_energy = sum(power(:,seg_1_start:seg_1_end), 1);
seg_2_energy = sum(power(:,seg_2_start:seg_2_end), 1);
seg_3_energy = sum(power(:,seg_3_start:seg_3_end), 1);
% 找到短时能量最高的音频段
[max_energy, max_seg] = max([seg_1_energy, seg_2_energy, seg_3_energy]);
% 截取短时能量最高的音频段
if max_seg == 1
selected_seg = y(seg_1_start:seg_1_end);
elseif max_seg == 2
selected_seg = y(seg_2_start:seg_2_end);
else
selected_seg = y(seg_3_start:seg_3_end);
end
% 播放原声音频和选择的音频段
sound(y, Fs);
pause(length(y)/Fs); % 等待原声音频播放完毕
sound(selected_seg, Fs);
```
注:上述代码中假设原声音频文件名为`original_audio.wav`。你需要将其替换为你实际使用的文件名。