(1)通过对实际采集的语音信号进行分析和处理,获得数字信号处理实际应用的认识。
(2)熟悉信号的运算,包括平移与反转、相加、相乘等,掌握在MATLAB中进行信号频谱分析的基本方法;
(3)理解信号抽样的概念和抽样定理,掌握在MATLAB中处理语音信号的方法。
(4)掌握数字滤波器设计的知识,并通过对语音信号的去噪处理获得数字滤波器实际应用的知识。
(1)语音信号的获取;用麦克风自行采集两段语音信号[高频噪声人声+高频噪声](wav格式)0
(2)通过Matlab读入采集信号,观察其采样频率,并绘图采样信号语音信号的运算,包括平移和反褶、相加、相乘;3)周期信号的有限项傅里叶级数合成; (可用作仿真高频噪声
源)
(4)通过Matlab对语音信号进行谱分析,分析出噪声的频带
(5)连续时间信号的抽样;语音信号的抽样
(6)设计两种滤波器(频域、时域),对叠加入噪声的语音信号进行去噪处理。绘图并发声去噪后的信号。
下面是复制到word的代码,代码源码链接如下:
链接:https://pan.baidu.com/s/14jfXJ9Py9Ko8TQqu1ocmFQ?pwd=5y2v
提取码:5y2v
--来自百度网盘超级会员V4的分享
2、导入信号并画出原信号频谱图
% 导入语音文件
[voice, Fs] = audioread('myspeech.wav');
% 对语音信号进行谱分析
N = length(voice);
f = (0:N-1)*Fs/N;
Y = abs(fft(voice)/N).^2;
% 绘制原信号频谱图
figure(1)
plot(f, Y);
xlim([0, Fs/2]);
xlabel('Frequency (Hz)');
ylabel('Power Spectral Density');
title('Spectrum of Voice Signal');
% 观察采样频率
Fs
% 绘制采样信号的图形
t = (0:length(voice_noise)-1)/Fs;
figure(2)
plot(t, voice_noise);
xlabel('Time (s)');
ylabel('Amplitude');
figure(3)
title('Sampled Signal with Noise_add');%绘制带加性噪声的信号
plot(t, voice);
xlabel('Time (s)');
ylabel('Amplitude');
title('Sampled Signal');%绘制原信号
平移
%信号平移
% 将语音信号向右平移 5s
shift = 5*Fs; % 平移 5s,单位为采样点
voice_shifted = [zeros(shift,1); voice(1:end)];
% 播放平移后的语音信号
sound(voice_shifted, Fs);
% 绘制采样信号的图形
t = (0:length(voice_shifted)-1)/Fs;
figure(5)
plot(t, voice_shifted);
xlabel('Time (s)');
ylabel('Amplitude');
title('Shifted Signal');
反褶
%信号反褶
% 对语音信号进行反褶
voice_flipped = flip(voice);
% 播放反褶后的语音信号
sound(voice_flipped, Fs);
% 绘制采样信号的图形
t = (0:length(voice_flipped)-1)/Fs;
figure(6)
plot(t, voice_flipped);
xlabel('Time (s)');
ylabel('Amplitude');
title('Flipped Signal');
sound(voice_flipped, Fs);
相加
% 生成高频噪声
noise = 0.03*randn(length(voice),1);
% 叠加噪声到语音信号上
%信号运算——相加
voice_noise = voice + noise;
% 播放带加性噪声的语音信号
sound(voice_noise, Fs);
相乘
% 生成 5s 的乘性噪声
t = 0:1/Fs:5-1/Fs;
f1 = 1000; % 第一个正弦波的频率
f2 = 3000; % 第二个正弦波的频率
noise_mul = sin(2*pi*f1*t).*sin(2*pi*f2*t);
% 将乘性噪声与语音信号相乘
voice_noise_mul = voice .* noise_mul';
% 播放乘性噪声信号
sound(voice_noise_mul, Fs);
% 绘制采样信号的图形
t = (0:length(voice)-1)/Fs;
figure(4)
plot(t, voice_noise_mul);
xlabel('Time (s)');
ylabel('Amplitude');
title('Multiplicative Noise Signal');
sound(voice_noise_mul, Fs);%绘制带乘性噪声的信号,信号运算——相乘
3、周期信号的有限项傅里叶级数合成
% 信号参数
f = 5000; % 基频
fs = 100000; % 采样频率
T = 1/f; % 周期
N = 50; % 傅里叶级数项数
% 生成信号
t = 0:1/fs:T-1/fs; % 时间向量
x = sawtooth(2*pi*f*t); % 锯齿波信号
% 计算傅里叶系数
a0 = mean(x);
an = zeros(1,N);
bn = zeros(1,N);
for n = 1:N
an(n) = 2/T * trapz(t, x .* cos(2*pi*n*f*t));
bn(n) = 2/T * trapz(t, x .* sin(2*pi*n*f*t));
end
% 合成信号
x_hat = a0/2;
for n = 1:N
x_hat = x_hat + an(n)*cos(2*pi*n*f*t) + bn(n)*sin(2*pi*n*f*t);
end
% 绘制原始信号和合成信号
figure(1);
plot(t, x, 'r', t, x_hat, 'b');
xlabel('时间 (s)');
ylabel('幅值');
legend('原始信号', '合成信号');
这里我们生成了一个 5000 Hz 的锯齿波信号,并用有限项傅里叶级数合成生成了一个类似于高频噪声的信号。
4、对语音信号谱分析
% 对语音信号乘法噪声后的信号进行谱分析
N = length(voice_noise_mul);
f = (0:N-1)*Fs/N;
Y = abs(fft(voice_noise_mul)/N).^2;
% 绘制谱图
figure(7)
plot(f, Y);
xlim([0, Fs/2]);
xlabel('Frequency (Hz)');
ylabel('Power Spectral Density');
title('Spectrum of Voice Signal with Noise');
对比原信号频谱图和有噪声的频谱图,可看出噪声的频率区间。
5、探究不同抽样频率对采样信号的影响
% 读取语音信号
filename = 'myspeech.wav';
[x, fs] = audioread(filename);
x = x(:, 1); % 取左声道
% 抽样频率
fs1 = 1000;
fs2 = 2000;
fs3 = 4000;
fs4 = 8000;
% 抽样
y1 = resample(x, fs1, fs);
y2 = resample(x, fs2, fs);
y3 = resample(x, fs3, fs);
y4 = resample(x, fs4, fs);
% 绘制信号
t1 = (0:length(y1)-1)/fs1;
t2 = (0:length(y2)-1)/fs2;
t3 = (0:length(y3)-1)/fs3;
t4 = (0:length(y4)-1)/fs4;
figure(1);
subplot(5,1,1);
plot(t1, y1);
title(sprintf('抽样频率 %d Hz', fs1));
ylabel('幅值');
subplot(5,1,2);
plot(t2, y2);
title(sprintf('抽样频率 %d Hz', fs2));
ylabel('幅值');
subplot(5,1,3);
plot(t3, y3);
title(sprintf('抽样频率 %d Hz', fs3));
ylabel('幅值');
subplot(5,1,4);
plot(t4, y4);
title(sprintf('抽样频率 %d Hz', fs4));
ylabel('幅值');
subplot(5,1,5);
plot((0:length(x)-1)/fs, x);
title('原始信号');
xlabel('时间 (s)');
ylabel('幅值');
% 绘制频谱图
figure(2);
subplot(5,1,1);
spectrogram(y1, [], [], [], fs1, 'yaxis');
title(sprintf('抽样频率 %d Hz', fs1));
subplot(5,1,2);
spectrogram(y2, [], [], [], fs2, 'yaxis');
title(sprintf('抽样频率 %d Hz', fs2));
subplot(5,1,3);
spectrogram(y3, [], [], [], fs3, 'yaxis');
title(sprintf('抽样频率 %d Hz', fs3));
subplot(5,1,4);
spectrogram(y4, [], [], [], fs4, 'yaxis');
title(sprintf('抽样频率 %d Hz', fs4));
subplot(5,1,5);
spectrogram(x, [], [], [], fs, 'yaxis');
title('原始信号');
% 播放声音
sound(x, fs);
pause(length(x)/fs);
sound(y1, fs1);
pause(length(y1)/fs1);
sound(y2, fs2);
pause(length(y2)/fs2);
sound(y3, fs3);
pause(length(y3)/fs3);
sound(y4, fs4);
6、时域和频域滤波器滤去噪声
% 设计时域滤波器
[b, a] = butter(6, [0.2, 0.4], 'bandpass'); % 滤波器阶数为6,截止频率范围为0.2~0.4
voice_noise_mul_filtered_1 = filter(b, a, voice_noise_mul); % 对混叠信号进行滤波
% 绘制时域图
t = (0:length(voice_noise_mul_filtered_1)-1)/Fs;
figure(8);
subplot(2,1,1);
plot(t, voice_noise_mul_filtered_1);
title('去除乘性噪声后的信号(时域)');
xlabel('时间 (s)');
ylabel('幅值');
% 绘制频谱图
N = length(voice_noise_mul_filtered_1); % 信号长度
f = linspace(0, Fs/2, N/2+1); % 构造频域坐标轴
Y = fft(voice_noise_mul_filtered_1); % 进行傅里叶变换
P = abs(Y(1:N/2+1)).^2/N; % 计算功率谱密度
subplot(2,1,2);
plot(f, P);
title('频谱图');
xlabel('频率 (Hz)');
ylabel('功率谱密度');
% 播放处理后的信号
soundsc(voice_noise_mul_filtered_1, Fs);
Fs = 8000; % 采样率为8kHz
f = linspace(0, Fs, length(voice_noise_mul)); % 构造频域坐标轴
Hd = design(fdesign.lowpass('N,Fc', 6, 3000, Fs)); % 设计低通滤波器,截止频率为3000Hz
voice_noise_mul_filtered_2 = filter(Hd, voice_noise_mul); % 对混叠信号进行滤波
% 绘制时域图
t = (0:length(voice_noise_mul_filtered_2)-1)/Fs;
figure(9);
subplot(2,1,1);
plot(t, voice_noise_mul_filtered_2);
title('去除乘性噪声后的信号(频域)');
xlabel('时间 (s)');
ylabel('幅值');
% 绘制频谱图
N = length(voice_noise_mul_filtered_2); % 信号长度
f = linspace(0, Fs/2, N/2+1); % 构造频域坐标轴
Y = fft(voice_noise_mul_filtered_2); % 进行傅里叶变换
P = abs(Y(1:N/2+1)).^2/N; % 计算功率谱密度
subplot(2,1,2);
plot(f, P);
title('频谱图');
xlabel('频率 (Hz)');
ylabel('功率谱密度');
% 播放处理后的信号
soundsc(voice_noise_mul_filtered_2, Fs);