1. 程式人生 > 其它 >【通訊】基於matlab語音訊號模擬【含Matlab原始碼 957期】

【通訊】基於matlab語音訊號模擬【含Matlab原始碼 957期】

一、簡介

1 整體流程設計
1.1 樣本音訊訊號的頻譜分析
1.2 對音訊訊號的濾波
1.3 對音訊訊號進行PCM編碼
1.4 對編碼後的訊號進行漢明編碼
1.5 對編碼後的訊號進行qpsk調製
1.6 傳送訊號進入AWGN通道
1.7 對接收到的訊號進行qpsk解調
1.8 通道譯碼-漢明糾錯和譯碼
1.9 對音訊訊號進行pcm譯碼並播放

2 主要模組說明
2.1 pcm編解碼---pcmcoder()&pcmdecoder()
pcm為脈衝調製,選取的壓縮特性為A律,採用十三折線編碼演算法,如下圖所示。

從圖中可以看到,先把X軸的0~1分為8個不均勻段,其分法是:將0—1之間一分為二,其中點為l,2,取1/2~1之間作為第八段;剩餘的0—1/2再一分為二,中點為1/4,取1/4—1/2之間作為第七段,再把剩餘的0—1/4一分為二,中點為1/8,取1/8~1/4之間作為第六段,依此分下去,直至剩餘的最小一段為0~1/128作為第一段。而Y軸的0~1均勻地分為八段,它們與x軸的八段一一對應。從第一段到第八段分別為,0~1/8,1/8—2/8,⋯,7/8~l。這樣,便可以作出由八段直線構成的一條折線。再加上第三象限的八段折線,共l6段,由於正向一、二兩段和負向一、二兩段的斜率相同,這四段實際上為一條直線,因此,正、負雙向的折線總共由l3條直線段構成,故稱其為13折線。
2.2 漢明編解碼---hanmingcoder()&hanmingdecoder()
漢明碼是一種線性分組碼。線性分組碼是指將資訊序列劃分為長度為k的序列段,在每一段後面附加r位的監督碼,且監督碼和資訊碼之間構成線性關係,即它們之間可由線性方程組來聯絡。這樣構成的抗干擾碼稱為線性分組。
碼。
設碼長為n,資訊位長度為k,監督位長度為r=n-k。如果需要糾正一位出錯,因為長度為n的序列上每一位都可能出錯,一共有n種情況,另外還有不出錯的情況,所以我們必須用長度為r的監督碼錶示出n+1種情況。而長度為r的監督碼一共可以表示2^r種情況。採用(7,4)漢明編碼,原資訊碼4位分組,採用3位監督碼。
漢明碼是一個校驗很嚴謹的編碼方式。通過對4個數據位的3個位的3次組合檢測來達到具體碼位的校驗與修正目的(不過只允許1個位出錯,兩個出錯就無法檢查出來了)。在校驗時則把每個漢明碼與各自對應的資料位值相加,如果結果為偶數(糾錯程式碼為0)就是正確,如果為奇數(糾錯程式碼為1)則說明當前漢明碼所對應的三個資料位中有錯誤,此時再通過其他兩個漢明碼各自的運算來確定具體是哪個位出了問題。 
解碼時首先輸入7位漢明碼a1a2a3a4a5a6a7,然後根據這7位碼a1a2a3a4a5a6a7,計算校正子S1,S2,S3,S4的值,可知校正子S與(7,4)漢明碼各位之間的關係,要判定校正子與0的關係,若等於0,則表示沒有錯誤;若不為0,則表示其中有一位出錯。通過校正子S與錯誤圖樣E之間的關係,將得到的錯誤圖樣與譯碼輸出進行模二加,糾正錯誤。將沒有錯誤的漢明碼或已經糾正1個錯誤的漢明碼輸出,完成譯碼程式。
2.3 qpsk調製與解調---qpskcoder()&qpskdecoder()


果。

二、原始碼

clc;clear all;

%/*************************讀入音訊檔案*******************************/
long=input('想處理的音樂的長度(推薦值200 000以下,太長會很慢):');
disp('**********請欣賞傳送的的音樂*********')
[x,fs]=audioread('高山流水.wav',[1 long]);
sound(x,fs);
X=fft(x,long);
magX=abs(X);
angX=angle(X);

figure;%畫圖
subplot(321);plot(x);title('原始訊號波形');
subplot(322);plot(abs(X)); title('原始訊號頻譜');


%/*************************對音訊訊號濾波*******************************/
N=5;wc=4000/6000;
[b,a]=butter(N,wc);%用巴特沃斯濾波器進行濾波
X=fft(x);
subplot(323);plot(x);title('濾波前訊號的波形');
subplot(324);plot(abs(X));title('濾波前訊號的頻譜');
y=filter(b,a,x);
Y=fft(y);
subplot(325);plot(y);title('IIR濾波後訊號的波形');
subplot(326);plot(abs(Y));title('IIR濾波後訊號的頻譜');


%/*************************對音訊訊號進行pcm編碼*************************/
L=length(y);
pcmy=pcmcoder(y,L,long);

%/*************************對編碼後的訊號進行通道編碼-漢明編碼************/

s=pcmy;
L=length(s);
h=zeros(1,L+L/4*3);%產生編碼序列
N=L+L/4*3;
h=hanmincoder(s,L);
 
 
%/*************************對編碼後的訊號進行qpsk調製********************/
sig=qpskcoder(N,h);



%/*************************傳送訊號進入AWGN通道**************************/
%加入噪聲 
n=noise(N,L);
r=sig+n;%檢測器的輸入模組
    
    
%/*************************對接收到的訊號進行qpsk解調********************/    
rr=qpskdecoder(N,r);
 
%/*************************通道譯碼-漢明糾錯和譯碼***********************/
y=hanmingdecoder(rr,L) ;

%/*************************對音訊訊號進行pcm譯碼************************/
pcmyout=pcmdecoder(y,long);
disp('**********請欣賞接收到的音樂*********')
sound(pcmyout,fs); 

disp('**********程式結束,謝謝*********')

function  y=hanmingdecoder(rr,L) 
 %漢明糾錯
for i=1:length(rr)/7
        s01=xor(xor(xor(rr(7*i-6),rr(7*i-5)),rr(7*i-4)),rr(7*i-2));
        s02=xor(xor(xor(rr(7*i-6),rr(7*i-5)),rr(7*i-3)),rr(7*i-1));
        s03=xor(xor(xor(rr(7*i-6),rr(7*i-4)),rr(7*i-3)),rr(7*i-0));
         if s01==0&&s02==0&&s03==1;
             rr(7*i)=not(rr(7*i));
         elseif s01==0&&s02==1&&s03==0;
             rr(7*i-1)=not(rr(7*i-1));
         elseif s01==1&&s02==0&&s03==0;
             rr(7*i-2)=not(rr(7*i-2));    
         elseif s01==0&&s02==1&&s03==1;
             rr(7*i-3)=not(rr(7*i-3));
          elseif s01==1&&s02==0&&s03==1;
             rr(7*i-4)=not(rr(7*i-4));
          elseif s01==1&&s02==1&&s03==0;
             rr(7*i-5)=not(rr(7*i-5));
          elseif s01==1&&s02==1&&s03==1;
             rr(7*i-6)=not(rr(7*i-6));
         elseif s01==0&&s02==0&&s03==0;
             continue;
         end 
end
%漢明譯碼(把經過糾錯的序列去掉漢明碼還原為原始的序列)
y=zeros(1,L);%最後的序列
j=1;
for i=0:length(rr)/7-1
    y(j)=rr(7*i+1);
    y(j+1)=rr(7*i+2);
    y(j+2)=rr(7*i+3);
    y(j+3)=rr(7*i+4);%取每一個序列單元的前四個碼元
    j=j+4;
end
end




三、執行結果


四、備註

版本:2014a
完整程式碼或代寫加1564658423