作业在这里存一下,需要代码的拿去用,应该写的挺清楚了。
在Matlab软件平台,利用函数wavrecord函数录制一段语音,采样频率fs=10000Hz,长度为5s。用sound函数播放声音。用wavread对语音信号进行采样,记住采样频率和采样点数。 或者在Python环境下,利用Pyaudio语音处理包实现录音。
语音信号的频谱分析
首先画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到语音信号的频谱特性 。
加入单频噪声
原始的语音信号加上一个高频余弦噪声,频率为4kHz。画出加噪后的语音信号时域和频谱图,与原始信号对比,可以很明显的看出区别。
加入高斯白噪声
调用matlab的randn函数生成高斯分布的白噪声,将产生的高斯白噪声叠加在录制的语音信号上。画出加噪后的语音信号时域和频谱图,与原始信号对比,可以很明显的看出区别。
比较加噪前后语音信号的波形及频谱
在一个窗口同时画出加噪前后的波形及频谱。
回放语音信号
在Matlab中,函数sound可以对声音进行回放。感觉加噪前后的声音有变化。或者利用Python的工具回放加噪的声音 。
使用audiorecorder进行采样,采样频率Fs=10000Hz,采样时常t=5s,使用audiowrite将声轨保存。
Fs=10000; %采样频率
t=5; %采样时长
% 采集音频
recObj = audiorecorder(Fs,8,1);
disp('Start speaking.')
recordblocking(recObj, 2);
disp('End of Recording.');
% 获取录音数据
myRecording = getaudiodata(recObj);
% 播放声轨
sound(myRecording,Fs);
% 绘制录音数据波形
plot(myRecording);
%存储语音信号
filename = 'wave.wav';
audiowrite(filename,myRecording,Fs);
clear;clc;
%读取信号
[origin_signal,fs] = audioread('wave.wav'); %读取音频文件,pyr为信号,fs为采样频率
t = length(origin_signal)/fs; %计算音频长度
sample_points=[1/fs:1/fs:t]; %计算采样点横坐标
freq_signal=fft(origin_signal); %计算频谱信号
freq_signal=fftshift(freq_signal); %频谱搬迁
%绘制原始信号时域波形
subplot(211);
plot(sample_points,origin_signal);
title('Time domain')
xlabel('Time/s');
ylabel('Amplitude');
%绘制原始信号时域波形
subplot(212);
plot([-fs:1:fs-1]/2,abs(freq_signal));
title('Frequency domain')
xlabel('Frequency/Hz');
ylabel('Amplitude');
结果如图所示:
加入单频噪声
加入了一个振幅0.2,频率为4000Hz的余弦信号,可以观察到时域中叠加了一个高频余弦信号,幅度谱中在±4000Hz处有明显的频率分量。
clear;clc;
%读取信号
[origin_signal,fs] = audioread('wave.wav'); %读取音频文件,pyr为信号,fs为采样频率
t = length(origin_signal)/fs; %计算音频长度
sample_points=[1/fs:1/fs:t]; %计算采样点横坐标
%加入单频噪声
cos_fs=4000; %余弦信号频率
cos_noise=0.01*cos(2*pi*cos_fs*sample_points);%添加振幅0.01余弦信号
cos_noise=cos_noise';
signal_with_cos_noise=origin_signal+cos_noise; %叠加噪声
sound(signal_with_cos_noise,fs); %播放,有刺耳蜂鸣
freq_signal=fft(signal_with_cos_noise); %计算频谱信号
freq_signal=fftshift(freq_signal); %频谱搬迁
%绘制信号时域波形
subplot(211);
plot(sample_points,signal_with_cos_noise);
title('Time domain')
xlabel('Time/s');
ylabel('Amplitude');
%绘制信号时域波形
subplot(212);
plot([-fs/2:1/t:fs/2-1/t],abs(freq_signal));
title('Frequency domain')
xlabel('Frequency/Hz');
ylabel('Amplitude');
结果如图所示:
加入高斯白噪声
加入了信噪比为10比1的高斯白噪声,可以观察到时域上出现了嘈杂的噪声信号,频谱上每个频率分量都有所增加。
clear;clc;
%读取信号
[origin_signal,fs] = audioread('wave.wav'); %读取音频文件,pyr为信号,fs为采样频率
t = length(origin_signal)/fs; %计算音频长度
sample_points=[1/fs:1/fs:t]; %计算采样点横坐标
%加入高斯白噪声
[signal_with_gauss_noise,noise]=noisegen(origin_signal,10); %添加十比一信噪比的高斯白噪声
sound(signal_with_gauss_noise,fs); %播放,声音嘈杂
freq_signal=fft(signal_with_gauss_noise); %计算频谱信号
freq_signal=fftshift(freq_signal); %频谱搬迁
%绘制信号时域波形
subplot(211);
plot(sample_points,signal_with_gauss_noise);
title('Time domain')
xlabel('Time/s');
ylabel('Amplitude');
%绘制信号时域波形
subplot(212);
plot([-fs/2:1/t:fs/2-1/t],abs(freq_signal));
title('Frequency domain')
xlabel('Frequency/Hz');
ylabel('Amplitude');
可以从结果中看到,绿色信号添加了高频余弦信号,表现出很多高频周期信的噪声,频谱中明显观察到在±4000Hz处有两个尖峰。红色信号为高斯白噪声,看上去嘈杂无规律,在频谱中增加了每个频率分量的成分。原信号使用蓝色,由于颜色被覆盖看不清楚,在放大后可看到细节。
clear;clc;
%读取信号
[origin_signal,fs] = audioread('wave.wav'); %读取音频文件,pyr为信号,fs为采样频率
t = length(origin_signal)/fs; %计算音频长度
sample_points=[1/fs:1/fs:t]; %计算采样点横坐标
freq_signal=fft(origin_signal); %计算频谱信号
freq_signal=fftshift(freq_signal); %频谱搬迁
%加入单频噪声
cos_fs=4000; %余弦信号频率
cos_noise=0.01*cos(2*pi*cos_fs*sample_points);%添加振幅0.01余弦信号
cos_noise=cos_noise';
signal_with_cos_noise=origin_signal+cos_noise; %叠加噪声
freq_signal_cos=fft(signal_with_cos_noise); %计算频谱信号
freq_signal_cos=fftshift(freq_signal_cos); %频谱搬迁
%加入高斯白噪声
[signal_with_gauss_noise,noise]=noisegen(origin_signal,20); %添加十比一信噪比的高斯白噪声
freq_signal_gauss=fft(signal_with_gauss_noise); %计算频谱
freq_signal_gauss=fftshift(freq_signal_gauss); %频谱搬迁
%绘制原始信号时域波形
subplot(211);
title('Time domain')
xlabel('Time/s');
ylabel('Amplitude');
plot(sample_points,origin_signal,'b');
hold on;
plot(sample_points,signal_with_cos_noise,'g');
hold on;
plot(sample_points,signal_with_gauss_noise,'r');
hold on;
%绘制原始信号时域波形
subplot(212);
title('Frequency domain')
xlabel('Frequency/Hz');
ylabel('Amplitude');
plot([-fs/2:1/t:fs/2-1/t],abs(freq_signal),'b');
hold on;
plot([-fs/2:1/t:fs/2-1/t],abs(freq_signal_cos),'g');
hold on;
plot([-fs/2:1/t:fs/2-1/t],abs(freq_signal_gauss),'r');
hold on;
结果如图所示:
sound(origin_signal,fs); %播放原声轨
sound(signal_with_cos_noise,fs); %播放带有高频余弦信号的声轨
sound(signal_with_gauss_noise,fs); %播放带有高斯白噪声的声轨
加入高频余弦信号后,除了本身的录音外,还有非常刺耳的蜂鸣声。
加入高斯白噪声后,声音变得嘈杂,降低信噪比至一定程度后,原本的声轨靠人耳就难以分别了。