MATLAB对语音信号进行量化
1、首先使用Matlab读取语音文件;
1.1 这里注意我使用的是Matlab2014a,读取语音文件的函数是audioread()这个函数在其他版本里可能没有
1.2 语音的格式必须是.WAV格式
1.3 Matlab默认的采样频率是44.1KHZ
2、对语音进行播放
使用sound()函数
3、使用plot()绘制语音信号的时域、频域图
4、对语音信号进行量化,绘制量化后的信号时域和频域图
M可是设置量化的大小,如果是8比特量化,M设定为255
M 必须大于1 ,且M设定的越小,量化的效果越明显,量化后信号的频谱中出现了一部分噪声,就是我们所说的量化噪声
图中绿色为原始语音信号和其频谱,蓝色为经过8比特量化后的信号和其频谱图,量化噪声的幅值很小需要放大才能看得到
程序中还对一个单频率的正弦信号进行了量化(需要在程序中改一小行,)
红色的为原始信号
量化效果如下
量化后的信号具有阶梯状,引入了高频噪声
量化后的频谱如下图,不再是原始信号干净的单频谱
完整代码如下:
clc
clear
y = 0: 50000 ;
[pyr , fs ] = audioread('C:\Users\Administrator\Desktop\FPGA毕业设计\语音采集与处理\MATLAB仿真\yuyin2.wav');
L = length(pyr) ;
%sound(pyr,64000) ;
FFT_sig = fft(pyr,fs) ;
ts = (0:L-1) /fs ; % The moment of the raw data point
xf = fs/(length(pyr) - 1) ;
xf1 = xf*(0:length(FFT_sig) - 1) ; % Frequency scale on the frequency domain diagram
subplot(2 ,2 ,1 ) ;
plot(xf1,abs(FFT_sig)) ; title('Spectrum of the original signal ') ;
xlabel('Time/s' ) ; ylabel('Amplitued') ;
subplot(2 ,2,3 ) ;
plot(ts ,pyr) ;
t_y1 = (L -1) / (4*fs) ;
x1 = 0 : t_y1: L ; % sampling frequency
y1 = 5 * sin(x1*8000*pi) ;
sig_2 = y1 ;
length(sig_2)
t = (0:length(sig_2))/fs ;
%hold on ;
min = 999 ; max = -999 ;
M = 8 ;
for i = 1 :length(sig_2) % Get the maximum and minimum values of the data
if(sig_2(i) < min)
min = sig_2(i) ;
end
if(sig_2(i) > max)
max = sig_2(i) ;
end
end
det = (max - min) / M ; % Obtain a quantitative scale
m = zeros(1,M) ;
for i = 1:M
m(i) = min + i * det ; % Quantitative value
end
qv = zeros(1,floor(L)) ;
node = [min - 0.0001 , m(1:M-1) ,max + 0.0001] ;
display(node(1));
for i = 1:length(sig_2) % Quarntify data
for j = 1:M
if(node(j) < sig_2(i) && sig_2(i) <= node(j + 1))
qv(i) = (node(j) + node(j + 1) ) / 2 ;
end
end
end
subplot(2,2,4)
% plot(t(1:length(sig_2)) ,qv(1:length(sig_2)) ,'b') ;
plot(t(1:length(sig_2)) ,qv(1:length(sig_2)) ,'b');
% Spectrogram
FFT_qv = fft(qv,fs) ;
xf_qv = fs/(length(qv) - 1 ) ;
x_qv = xf_qv*(0 : length(FFT_qv) -1 );
subplot(2,2,2)
plot(x_qv , abs(FFT_qv))
title('Spectrum of the original signal ') ;
xlabel('Time/s' ) ; ylabel('Amplitued') ;
figure
subplot(2,1,1)
plot(qv,'b')
axis([0 200 -5 5]);
subplot(2,1,2)
plot(y1,'r')
axis([0 200 -5 5]);
希望对大家有所帮助