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