FFT频谱分析(matlab代码)

作业在这里存一下,需要代码的拿去用,应该写的挺清楚了。

实验要求

  1. 在Matlab软件平台,利用函数wavrecord函数录制一段语音,采样频率fs=10000Hz,长度为5s。用sound函数播放声音。用wavread对语音信号进行采样,记住采样频率和采样点数。  或者在Python环境下,利用Pyaudio语音处理包实现录音。

  2. 语音信号的频谱分析

    首先画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到语音信号的频谱特性 。

  3. 加入单频噪声

    原始的语音信号加上一个高频余弦噪声,频率为4kHz。画出加噪后的语音信号时域和频谱图,与原始信号对比,可以很明显的看出区别。

  4. 加入高斯白噪声

    调用matlab的randn函数生成高斯分布的白噪声,将产生的高斯白噪声叠加在录制的语音信号上。画出加噪后的语音信号时域和频谱图,与原始信号对比,可以很明显的看出区别。

  5. 比较加噪前后语音信号的波形及频谱

    在一个窗口同时画出加噪前后的波形及频谱。

  6. 回放语音信号

    在Matlab中,函数sound可以对声音进行回放。感觉加噪前后的声音有变化。或者利用Python的工具回放加噪的声音 。

代码及结果

  1. 语音信号采样

使用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);
  1. 语音信号的频谱分析
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');

结果如图所示:

FFT频谱分析(matlab代码)_第1张图片

  1. 加入单频噪声

    加入了一个振幅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');

结果如图所示:

FFT频谱分析(matlab代码)_第2张图片

  1. 加入高斯白噪声

    加入了信噪比为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');

FFT频谱分析(matlab代码)_第3张图片

  1. 比较加噪前后语音信号的波形及频谱

可以从结果中看到,绿色信号添加了高频余弦信号,表现出很多高频周期信的噪声,频谱中明显观察到在±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;

结果如图所示:

总体:
FFT频谱分析(matlab代码)_第4张图片

细节:
FFT频谱分析(matlab代码)_第5张图片

  1. 回放语音信号
sound(origin_signal,fs); %播放原声轨
sound(signal_with_cos_noise,fs); %播放带有高频余弦信号的声轨
sound(signal_with_gauss_noise,fs); %播放带有高斯白噪声的声轨

加入高频余弦信号后,除了本身的录音外,还有非常刺耳的蜂鸣声。

加入高斯白噪声后,声音变得嘈杂,降低信噪比至一定程度后,原本的声轨靠人耳就难以分别了。

你可能感兴趣的:(数字信号处理,matlab,dsp,数字信号处理)