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]);
希望對大家有所幫助