matlab 将原声音频的每两个相邻的零点当作一段,并记录这两个零点的横坐标,分别叠加自身1次到50次,用刚刚的横坐标分别截取1次到50次的音频段,把他们与原声的音频段进行短时能量比较,筛选出最高的音频段,并输出短时能量最高的零点坐标
时间: 2024-01-22 09:20:37 浏览: 23
以下是MATLAB代码示例,实现了所描述的功能:
```
% 读取原始音频文件
[y, Fs] = audioread('original_audio.wav');
% 找到每两个相邻的零点,并记录横坐标
zero_crossings = find(diff(sign(y)) ~= 0);
zero_crossings = zero_crossings(1:2:end); % 取每两个零点中的第一个
% 初始化结果变量
max_energy = 0;
max_energy_index = 0;
% 对每个零点进行处理
for i = 1:length(zero_crossings)
% 取当前零点前后的1秒音频
start_index = max(1, zero_crossings(i) - Fs);
end_index = min(length(y), zero_crossings(i) + Fs);
audio_segment = y(start_index:end_index);
% 对当前零点进行自身1次到50次的叠加
for j = 1:50
repeated_segment = repmat(audio_segment, 1, j);
% 计算短时能量
frame_size = 0.02 * Fs; % 20ms 的帧长
num_frames = floor(length(repeated_segment) / frame_size);
energy = zeros(1, num_frames);
for k = 1:num_frames
start_index = (k-1)*frame_size + 1;
end_index = k*frame_size;
energy(k) = sum(repeated_segment(start_index:end_index) .^ 2);
end
% 找到最高的短时能量
[max_energy_segment, max_energy_frame] = max(energy);
% 如果当前短时能量更高,则更新结果变量
if max_energy_segment > max_energy
max_energy = max_energy_segment;
max_energy_index = zero_crossings(i) + (max_energy_frame - 1) * frame_size;
end
end
end
% 输出结果
disp(['最高的短时能量为:', num2str(max_energy)]);
disp(['对应的零点坐标为:', num2str(max_energy_index)]);
```
这段代码首先读取原始音频文件,并找到每两个相邻的零点。然后对于每个零点,它前后的1秒音频会被取出来,并进行自身1次到50次的叠加,分别计算每个叠加后的短时能量。最后找到最高的短时能量,并输出对应的零点坐标。