语音幅度统计-matlab-有问题
語音信號的統計特性
幅度分布的概率密度
歸一化:均值為0,方差為1.
可實現歸一化的matlab函數 zscore: z-score 標準化(正太標準化)是基于原始數據的均值(mean)和標準差(standard deviation)進行數據的標準化。將A的原始值x使用z-score標準化到x’。
(matlab的歸一化函數為mapminmax,此處以A=[100 200 300 400 500]為例,使用mapminmax函數進行歸一化,調用格式為[A1,PS]=mapminmax(A)。A1為歸一化后的數值。PS是一種對應關系,包含數據的最大值最小值等,如下圖所示。歸一化函數的對應關系為y=(ymax-ymin)*(x-xmin)/(xmax-xmin)+ymin。此處以200驗證某一個元素的值,那么y=2*(200-100)/(500-100)+(-1)=-1/2=-0.5)
均值 mean
方差 var
標準差 std
幅度分布
αX\alpha_XαX?是語音信號的標準差
x是語音信號的幅度
1.修正伽瑪(Gamma)概率密度
PG(x)=k2π?e?k∣x∣∣x∣P_G(x)=\frac{\sqrt k}{2 \sqrt \pi} \cdot \frac{e^{-k|x|}}{\sqrt{|x|}} PG?(x)=2π?k???∣x∣?e?k∣x∣?
k=32αXk=\frac{\sqrt 3}{2\alpha_X} k=2αX?3??
2.拉普拉斯(Laplacian)分布
PL(x)=0.5αe?α∣x∣P_L(x)=0.5\alpha e^{-\alpha|x|} PL?(x)=0.5αe?α∣x∣
$\alpha 是語音信號的標準差是語音信號的標準差是語音信號的標準差\alpha_x$決定的常數
α=2σx\alpha=\frac{\sqrt{2}}{\sigma_x} α=σx?2??
3.高斯密度分布
Pg(x)=12πσxexp(?x22σx2)P_g(x)=\frac{1}{\sqrt{2\pi}\sigma_x}exp(-\frac{x^2}{2 \sigma_x^2}) Pg?(x)=2π?σx?1?exp(?2σx2?x2?)
x是語音信號的幅度,αx\alpha_xαx?是語音信號的標準差
matlab
畫出語音信號的幅度概率密度圖
1.畫出直方圖
用函數hist()可以得出每個區間的頻數
[n,x]=hist(data1,100);%計算小區間內的頻數及區間中點值
2.在畫出幅度概率密度函數圖
用每個區間的頻數除以數據,可以得出每個區間的頻率
3.matlab代碼
close all; clear; clc; [data1,fs]=audioread('soo2.wav'); data=abs(data1); % %histogram(data1);hold on % u=mean(data);%均值 % v=std(data);%標準差 % h=max(data)-min(data);%極差 % d=0.01;%根據直方圖,得到每個區間的長度為0.1[n,x]=hist(data1,100);%計算小區間內的頻數及區間中點值 % hold on % plot(x,n); % hold on % % xlabel('每個區間中點值'); subplot(211)hist(data1,100)%畫出直方圖,xlabel('幅度'); ylabel('頻數');title('幅度直方圖');hold on % ylabel('頻數'); % n為每個區間內的頻數 %f=data/length(data);%計算頻率 %f1=f/d;%頻率除以分割區間的長度 % x1=min(data):0.01:max(data); % y=normpdf(x1,u,v); % plot(x1,y,'r','linewidth',2); subplot(212) fi=n/sum(n); plot( x,fi); xlabel('幅值'); ylabel('概率'); title('幅度概率密度曲線'); hold on4.導入不同的類型的音頻對比
man
women
music
speak
帶入其他概率密度曲線對比
只導入語音信號(即只有講話的聲音speak.wav)
分別用高斯,拉普拉斯,伽瑪帶入對比。
沒法把數據歸一化為均值為0,方差為1的數據。
都是字均值為0的附近,方差為1的附近。
man
musci
women
speak
完全說話-普通話標準考試說話
對比起來,拉普拉斯好像好點
代碼:
clear; clc [data1,fs]=audioread('man.wav'); [n,x]=hist(data1,100);%計算小區間內的頻數及區間中點值 v=std(x);%標準差 j=abs(x);%絕對值 fi=n/sum(n); y=mapminmax(fi); plot( x,y,'linewidth',3); xlabel('幅值'); ylabel('概率'); title('幅度概率密度曲線'); hold on %gasi gs=(1/sqrt(2pi)v)exp(-1x.^2/2v^2); g=mapminmax(gs); plot(x,g,'linewidth',3); hold on %la a=sqrt(2)/v;%公式 pl=0.5aexp(-aj);%公式 p2=zscore(pl); plot(x,p2,'linewidth',3); %gama j=j'; k=sqrt(3)/(2v); gm1=sqrt(k)/(2sqrt(pi)); gm2=exp(-kj)/sqrt(j); gm=gm1gm2; gam=zscore(gm); plot(x,gm(:,1),'linewidth',3); %這里因為計算時j只被當成一個數,算出來的gm2為一個數 %轉制了j,使得為一列數據 %得出的結果只取第一列,函數為a(:,1) %man.wav,數據為最后一列,即為第一百列 hold on legend('語音信號','高斯','拉普拉斯','伽瑪');#問題
1.數據太少?
2.乖乖的?
總結
以上是生活随笔為你收集整理的语音幅度统计-matlab-有问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: $ajax 筛选某个属性,jQuery
- 下一篇: openssl windows安装