华南理工大学电信信号与系统实验5——语音信号的分析与处理

该文详细介绍了使用MATLAB进行语音信号处理的过程,包括信号获取、频谱分析、噪声识别以及通过设计时域和频域滤波器进行去噪的方法。通过实例展示了如何对语音信号进行平移、反转、相加和相乘等运算,并探讨了不同抽样频率对信号质量的影响。最后,实现了对乘性噪声的滤波处理,以恢复清晰的语音信号。
摘要由CSDN通过智能技术生成

(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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值