matlab 将原声音频的极值点前一个零点和下一个极值点前一个零点当作一段,并记录这两个零点的横坐标,分别叠加自身1次到50次,用刚刚的横坐标分别截取1次到50次的音频段,把他们与原声的音频段进行短时能量比较,筛选出最高的音频段
时间: 2024-01-22 16:20:10 浏览: 57
基于matlab进行1)采集音乐信号; 2)用频域方法分析语音信号特征; 3)设计滤波器对音乐信号滤波; 4)设计系统界面
以下是实现该功能的 Matlab 代码:
```matlab
% 读取原始音频文件
[y, Fs] = audioread('original_audio.wav');
% 计算短时能量
win_len = 0.02; % 窗口长度为20ms
win_shift = 0.01; % 窗口移动步长为10ms
E = short_time_energy(y, Fs, win_len, win_shift);
max_energy = 0;
max_energy_idx = 0;
max_energy_seg = [];
% 找到所有极值点
extreme_points = find_extreme_points(y);
% 遍历所有极值点
for i = 2:length(extreme_points)-1
% 取当前极值点前一个零点和下一个极值点前一个零点作为一段
seg_start = find(y(1:extreme_points(i)) == 0, 1, 'last') + 1;
seg_end = find(y(extreme_points(i):end) == 0, 1, 'first') + extreme_points(i) - 2;
seg = y(seg_start:seg_end);
% 叠加自身1次到50次
for j = 1:50
seg = [seg, repmat(seg, [1, j])];
% 分别截取1次到50次的音频段
for k = 1:j
segment = seg((k-1)*length(seg)/j+1:k*length(seg)/j);
% 计算短时能量
segment_energy = short_time_energy(segment, Fs, win_len, win_shift);
% 比较短时能量
if segment_energy > max_energy
max_energy = segment_energy;
max_energy_idx = i;
max_energy_seg = segment;
end
end
end
end
% 输出结果
disp(['最高能量的音频段在原始音频中的位置为:第', num2str(max_energy_idx), '个极值点前']);
```
其中,`short_time_energy()` 是一个计算短时能量的函数,`find_extreme_points()` 是一个找到所有极值点的函数。你需要自己编写这两个函数。
阅读全文