一、實驗原理
PCM,Pulse Code Modulation(脈沖編碼調(diào)制),即把從模擬信號抽樣、量化、編碼成為二迚制符號的基本過程, 稱為脈沖編碼調(diào)制。
模擬信號的數(shù)字化過程:
1、抽樣 – 時間離散:時間連續(xù)的信號 -> 時間離散、幅度連續(xù)的信號;
? 抽樣定理(香農(nóng)采樣定律、奈奎斯特采樣定律):設(shè)時間連續(xù)信號f(t),其最高截止頻率為fm, 如果用時間間隔為?? ≤ 1 2???? 的開關(guān)信號對f(t)迚行抽樣時,則f(t)就可被樣值信號唯一地表示。
? 這樣可以只傳輸這些離散的抽樣值,接收端就能恢復(fù)原模擬信號。
? 例:典型電話信號的最高頻率通常限制在3400Hz,而抽樣頻率通常采用8000Hz。
模擬信號抽樣及頻譜:
2、量化與編碼
?量化:一個連續(xù)幅度值的無限數(shù)集合 -> 一個 離散幅度值的有限數(shù)集合。
? 編碼:將量化后的信號編碼形成一個二迚制 碼組輸出。國際標(biāo)準(zhǔn)化的PCM碼組是用八位 碼組代表一個抽樣值。
? 均勻量化:量化間隔保持不變。
? 非均勻量化:根據(jù)信號的不同區(qū)間來確定量 化間隔 ? 非均勻量化優(yōu)勢:當(dāng)輸入信號具有非均勻分 布;改善了小信號時的信噪比。
二、A律13折線法
? 1位:極性正負(fù)
? 2-4位:段落碼,非均勻量化
? 5-8位:段內(nèi)碼,均勻量化
三、pcm編碼與解碼
題目:對于給定的語音文件進行a律13折線編碼,觀察原音頻信號波形、抽樣后音頻信號波形、編碼后的數(shù)據(jù)、解碼后的數(shù)據(jù)。
(1)讀取語音文件進行抽樣量化
%%讀取本地wav文件
filePath='Windows XP 關(guān)機.wav';
[y,Fs]=audioread(filePath);
y=y'; %轉(zhuǎn)置
yCh1=y(1,:); %取一個聲道
figure
dt=1/Fs;
t=0:dt:(length(yCh1)-1)*dt;
plot(t,yCh1);
title('wav音頻信號波形');
?(2)a律13折線編碼
sampleVal=8000;%8k抽樣率
[sampleData,a13_moddata]=PCM_13Encode(yCh1,Fs,sampleVal);
save('encode_data01.mat','a13_moddata');
figure
dt1=1/sampleVal;
t1=0:dt1:(length(sampleData)-1)*dt1;
plot(t1,sampleData);
title('wav音頻信號抽樣后的波形');
figure
plot(a13_moddata);
title('編碼后的bit數(shù)據(jù)');
(3)13折線具體編碼
在這里我們采用以下引用方式;
function [sampleData,a13_moddata] = PCM_13Encode(inputData,Fs,sampleVal)
[ a13_moddata ] = a_13coding( sampleData );
?a13_moddata 函數(shù):
function [ a13_moddata ] = a_13coding( x )
n=length(x);
a13_moddata=zeros(1,n*8);
for bb=1:n
Is=x(1,bb);
if Is>1||Is<-1,error('input must within [-1,1]'),end
Is=round(Is*2048);
C=zeros(1,8); %將8位PCM編碼初始化為全0
if Is>0
C(1)=1 ; %判斷抽樣值的正負(fù)
end
% the polarity determins C(1)
abIs=abs(Is);
if 0<abIs && abIs<=16
C(2:4)=[0 0 0]; %8級量化編碼
q=1;
a=0;
C(5:8)=e_coding(abIs,q,a); %16級量化編碼
end
if 16<abIs && abIs<=32
C(2:4)=[0 0 1];
q=1;
a=16;
C(5:8)=e_coding(abIs,q,a);
end
if 32<abIs && abIs<=64
C(2:4)=[0 1 0];
q=2;
a=32;
C(5:8)=e_coding(abIs,q,a);
end
if 64<abIs && abIs<=128
C(2:4)=[0 1 1];
q=4;
a=64;
C(5:8)=e_coding(abIs,q,a);
end
if 128<abIs && abIs<=256
C(2:4)=[1 0 0];
q=8;
a=128;
C(5:8)=e_coding(abIs,q,a);
end
if 256<abIs && abIs<=512
C(2:4)=[1 0 1];
q=16;
a=256;
C(5:8)=e_coding(abIs,q,a);
end
if 512<abIs && abIs<=1024
C(2:4)=[1 1 0];
q=32;
a=512;
C(5:8)=e_coding(abIs,q,a);
end
if 1024<abIs && abIs<=2048
C(2:4)=[1 1 1];
q=64;
a=1024;
C(5:8)=e_coding(abIs,q,a);
end
a13_moddata(1,(bb-1)*8+1:bb*8)=C; %得到8位pcm編碼
end
end
%16級量化編碼函數(shù)
function [ four ]=e_coding(Is,q,a)
four=zeros(1,4);
for k=1:16
if Is>a+(k-1)*q && Is<=a+k*q
four=dec2bin(k-1,4);
four=str2num(four(:))';
else
end
end
end
(4)pcm解碼
clc
clear
sampleVal=8000;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%讀取編碼數(shù)據(jù) mat文件
data =load('a02.mat') ; %讀取mat 文件
a13_moddata=data.a13_moddata; %獲取mat文件a13_moddata的數(shù)據(jù)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%PCM 13折線解碼
[outData] = PCM_13Decode( a13_moddata );
figure
dt1=1/sampleVal;
t1=0:dt1:(length(outData)-1)*dt1;
plot(t1,outData);
title('解碼還原后的語音波形');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%將語音數(shù)據(jù)寫入音頻WAV文件
writeData=[outData;outData]';%復(fù)制聲道1數(shù)據(jù)到聲道2,并轉(zhuǎn)置
writeFilePath='decode_data02.wav';
audiowrite(writeFilePath,writeData,sampleVal);
(5)解碼函數(shù)
解碼引用PCM_13Decode函數(shù),其中具體代碼為:
function [outData] = PCM_13Decode( inputData )
n=length(inputData);
outData=zeros(1,n/8);
MM=zeros(1,8);
for kk=1:n/8
MM(1:8)=inputData(1,(kk-1)*8+1:kk*8); %取得8位PCM碼
temp=MM(2)*2^2+MM(3)*2+MM(4) ; %將8位PCM碼的第2~4位二進制數(shù)轉(zhuǎn)化為10進制(三位二進制轉(zhuǎn)十進制)
%用于判斷抽樣值在哪個段落內(nèi)
% 段落序號i=1
if temp==0
q=1; %段內(nèi)量化間隔
a=0; %段落起始電平
end
% 段落序號i=2
if temp==1
q=1;
a=16;
end
% 段落序號i=3
if temp==2
q=2;
a=32;
end
% 段落序號i=4
if temp==3
q=4;
a=64;
end
% 段落序號i=5
if temp==4
q=8;
a=128;
end
% 段落序號i=6
if temp==5
q=16;
a=256;
end
% 段落序號i=7
if temp==6
q=32;
a=512;
end
% 段落序號i=8
if temp==7
q=64;
a=1024;
end
A= MM(5)*2^3+MM(6)*2^2+MM(7)*2+MM(8) ;%8位PCM碼的第5~8位二進制數(shù)轉(zhuǎn)化為10進制
%用于判斷抽樣值量化級數(shù)
R=(a+A*q+q/2)/2048;%取量化間隔中點值進行譯碼
if MM(1)==0 %判斷極性
R=-R;
end
outData(1,kk)=R;%譯碼后數(shù)據(jù)
end
end
文章來源:http://www.zghlxwxcb.cn/news/detail-473292.html
?以上就是pcm基于A律13折線的編碼與解碼的全部模塊了,放到一起就可以運行了,記得把文件名改成自己的,然后放到同一目錄中。文章來源地址http://www.zghlxwxcb.cn/news/detail-473292.html
到了這里,關(guān)于【通信原理實驗】基于A律13折線的PCM編碼與解碼(附完整代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!