%% 1. 读取音频文件(确保文件在工作目录,双声道转单声道)
maleFile = 'male.wav'; % 男声音频
femaleFile = 'female.wav';% 女声音频
musicFile = 'music.wav'; % 音乐音频
[y_male, Fs] = audioread(maleFile); % 读取信号及采样率
[y_female, ~] = audioread(femaleFile);
[y_music, ~] = audioread(musicFile);
% 处理双声道(取单声道)
if size(y_male,2)==2
y_male = y_male(:,1);
y_female = y_female(:,1);
y_music = y_music(:,1);
end
%% 2. 输出时域波形(以男声音频为例)
t_male = (0:length(y_male)-1)/Fs; % 时间轴
figure('Name','时域波形');
subplot(3,1,1);
plot(t_male, y_male);
title('原始男性语音时域波形'); xlabel('时间 (s)'); grid on;
%% 3. 调节声音大小(增益)
gain = 0.5; % 音量缩放系数(0.5 为缩小,>1 为放大)
y_male_gain = y_male * gain;
subplot(3,1,2);
plot(t_male, y_male_gain);
title('音量调节后时域波形'); xlabel('时间 (s)'); grid on;
%% 4. 两种信号混音(男女语音,需截断对齐长度)
len = min(length(y_male), length(y_female)); % 取较短长度
y_mix = (y_male(1:len) + y_female(1:len)) / 2; % 混音并归一化(避免溢出)
t_mix = (0:len-1)/Fs;
subplot(3,1,3);
plot(t_mix, y_mix);
title('男女语音混音时域波形'); xlabel('时间 (s)'); grid on;
%% 5. 音乐信号回音效果(延迟叠加)
delay_sec = 0.5; % 延迟 0.5 秒
delay = round(delay_sec * Fs); % 延迟样本数
y_music_echo = y_music; % 初始化回音信号
if delay < length(y_music) % 避免索引越界
y_music_echo(delay+1:end) = y_music_echo(delay+1:end) + 0.5*y_music(1:end-delay);
end
t_music = (0:length(y_music)-1)/Fs;
figure('Name','回音效果');
subplot(2,1,1);
plot(t_music, y_music);
title('原始音乐时域波形'); grid on;
subplot(2,1,2);
plot(t_music, y_music_echo);
title('回音处理后时域波形'); grid on;
%% 6. 频谱与音谱观察(8000、16000 点分析,以男声音频为例)
N_list = [8000, 16000]; % 分析点数
figure('Name','频谱分析');
for i = 1:2
N = N_list(i);
y_n = y_male(1:N); % 取前 N 点
Y = fft(y_n); % 傅里叶变换
f = (0:N-1)*Fs/N; % 频率轴
mag = abs(Y)/N; % 幅度谱(归一化)
phase = angle(Y); % 相位谱
subplot(2,2,i);
plot(f, mag);
title(['N=',num2str(N),' 幅度谱']); xlabel('频率 (Hz)'); grid on;
subplot(2,2,i+2);
plot(f, phase);
title(['N=',num2str(N),' 相位谱']); xlabel('频率 (Hz)'); grid on;
end
%% 7. 减抽样(混叠与非混叠,以音乐信号为例)
% 假设信号最高频率 f_max=5000Hz(实际可通过频谱分析确定)
f_max = 5000;
M_non_alias = 4; % 非混叠:Fs/M=44100/4=11025 ≥ 2*5000=10000
M_alias = 8; % 混叠:Fs/M=44100/8=5512.5 < 10000
% 非混叠减抽样
y_down_non = y_music(1:M_non_alias:end);
Fs_non = Fs/M_non_alias;
t_down_non = (0:length(y_down_non)-1)/Fs_non;
Y_down_non = fft(y_down_non);
f_down_non = (0:length(Y_down_non)-1)*Fs_non/length(Y_down_non);
mag_down_non = abs(Y_down_non)/length(Y_down_non);
% 混叠减抽样
y_down_alias = y_music(1:M_alias:end);
Fs_alias = Fs/M_alias;
t_down_alias = (0:length(y_down_alias)-1)/Fs_alias;
Y_down_alias = fft(y_down_alias);
f_down_alias = (0:length(Y_down_alias)-1)*Fs_alias/length(Y_down_alias);
mag_down_alias = abs(Y_down_alias)/length(Y_down_alias);
figure('Name','减抽样分析');
subplot(2,2,1);
plot(t_down_non, y_down_non);
title('非混叠减抽样(M=4)时域'); grid on;
subplot(2,2,2);
plot(f_down_non, mag_down_non);
title('非混叠减抽样幅度谱'); grid on;
subplot(2,2,3);
plot(t_down_alias, y_down_alias);
title('混叠减抽样(M=8)时域'); grid on;
subplot(2,2,4);
plot(f_down_alias, mag_down_alias);
title('混叠减抽样幅度谱'); grid on;
%% 8. IIR 低通滤波器设计(buttord + butter,以男声音频为例)
Wp = 1000; % 通带截止 1000Hz
Wsb = 1200; % 阻带截止 1200Hz
Rp = 1; % 通带波纹 1dB
Rs = 40; % 阻带衰减 40dB
% 归一化频率(数字频率,范围 [0,1])
Wp_norm = 2*Wp/Fs;
Wsb_norm = 2*Wsb/Fs;
% 设计滤波器阶数和截止频率
[n, Wn] = buttord(Wp_norm, Wsb_norm, Rp, Rs);
[b, a] = butter(n, Wn); % Butterworth 滤波器
% 零相位滤波(避免相位延迟)
y_filtered = filtfilt(b, a, y_male);
% 分析滤波后信号
Y_filtered = fft(y_filtered, 8000); % 8000 点 FFT
f_filtered = (0:7999)*Fs/8000;
mag_filtered = abs(Y_filtered)/8000;
phase_filtered = angle(Y_filtered);
figure('Name','IIR 滤波分析');
subplot(2,2,1);
plot(t_male, y_filtered);
title('滤波后时域波形'); xlabel('时间 (s)'); grid on;
subplot(2,2,2);
plot(f_filtered, mag_filtered);
title('滤波后幅度谱'); xlabel('频率 (Hz)'); grid on;
subplot(2,2,3);
plot(f_filtered, phase_filtered);
title('滤波后相位谱'); xlabel('频率 (Hz)'); grid on;
对代码进行检查修改
最新发布