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



希望对大家有所帮助

猜你喜欢

转载自blog.csdn.net/MengMengdenanren/article/details/86305116
今日推荐