MATLAB語音量化處理

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



希望對大家有所幫助

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章