功能描述:
PCM 脈沖編碼調(diào)制是Pulse Code Modulation的縮寫。脈沖編碼調(diào)制是數(shù)字通信的編碼方式之一。主要過(guò)程是將話音、圖像等模擬信號(hào)每隔一定時(shí)間進(jìn)行取樣,使其離散化,同時(shí)將抽樣值按分層單位四舍五入取整量化,同時(shí)將抽樣值按一組二進(jìn)制碼來(lái)表示抽樣脈沖的幅值。
function [sqnr,a_quan,code]=u_pcm(a,n)
%U_PCM 采樣樣本序列a的均勻PCM編碼.
% [SQNR,A_QUAN,CODE]=U_PCM(A,N)
% a=輸入序列.
% n=量化級(jí)別數(shù) (偶數(shù),2的冪次).
% sqnr=輸出的SQNR (以dB為單位).
% a_quan=編碼之前的量化輸出.
% code=編碼后的輸出.
amax=max(abs(a)); % 序列所含信號(hào)樣本中的峰值
a_quan=a/amax; % 每個(gè)樣本值與峰值之比(歸一化樣本值)
b_quan=a_quan;
d=2/n; % 量化步長(zhǎng)d
q=d.*[0:n-1]; % 每個(gè)量化級(jí)別的值(歸一化量化值)
q=q-((n-1)/2)*d; % 量化范圍[q-d/2, q+2/d],即[-(n/2)*d,(n/2)*d]
for i=1:n % 在量化范圍逐級(jí)尋找接近量化級(jí)別的歸一化樣本值
a_quan(find((q(i)-d/2 <= a_quan) & (a_quan <= q(i)+d/2)))=...
q(i).*ones(1,length(find((q(i)-d/2 <= a_quan) & (a_quan <= q(i)+d/2))));
b_quan(find( a_quan==q(i) ))=(i-1).*ones(1,length(find( a_quan==q(i) )));
end % 每個(gè)歸一化樣本值按最接近的量化級(jí)別修正
a_quan=a_quan*amax; % 得到修正后的樣本量化值(模擬信號(hào)的數(shù)字重建)
nu=ceil(log2(n)); % 量化級(jí)別所需的二進(jìn)制編碼比特?cái)?shù)
code=zeros(length(a),nu); % 編碼序列初始化為全零
for i=1:length(a) % 碼字?jǐn)?shù)
for j=nu:-1:0 % 碼字中的比特?cái)?shù),先求最高比特值
if ( fix(b_quan(i)/(2^j)) == 1)
code(i,(nu-j)) = 1; % 對(duì)量化值執(zhí)行模2除法,得到當(dāng)前碼字當(dāng)前比特值
b_quan(i) = b_quan(i) - 2^j; % 量化值模2計(jì)算后的余數(shù)繼續(xù)用于求下一個(gè)更低比特的值
end % 這里量化值編碼過(guò)程實(shí)際上是十進(jìn)制到二進(jìn)制的轉(zhuǎn)換
end % 完成一個(gè)量化值的編碼
end % 得到所有量化值的編碼碼字
sqnr=20*log10(norm(a)/norm(a-a_quan)); % 得到信號(hào)量化噪聲比,量化噪聲為信號(hào)樣本與量化值之差
聯(lián)系:highspeedlogic
QQ :1224848052
微信:HuangL1121
郵箱:1224848052@qq.com
網(wǎng)站:http://www.mat7lab.com/
網(wǎng)站:http://www.hslogic.com/
微信掃一掃:
|