clc clear %================================================ %已知抽样值以△为单位 %================================================ x = 500 pcmcode = pcmEnCode(x) amp = pcmDeCode(pcmcode) qerror = x-amp %================================================ %已知抽样值为实际电压值,则需先转换为以△为单位 %================================================ M = 5 d = M/2^11; x = 2.5 x0 = round(x/d) pcmcode = pcmEnCode(x0); amp0=pcmDeCode(pcmcode); amp0 = amp0*d qerror=x-amp0 function pcmcode = pcmEnCode(s) start_t=[0,2.^(4:11)]; width_t=[1,1,2,4,8,16,32,64]; pcm=0; if s>0 pcm=pcm+bitshift(1,7); else s=abs(s); end for i = 0:7 if s < start_t(i+2) pcm=pcm+bitshift(i,4); pcm=pcm+floor((s-start_t(i+1))/width_t(i+1)); break end end pcmcode=dec2bin(pcm,8); end function amp = pcmDeCode(pcmcode) start_t=[0,2.^(4:11)]; width_t=[1,1,2,4,8,16,32,64]; code=bin2dec(pcmcode); ucode=bitand(code,0b01111111); k=bitshift(ucode,-4); m=bitand(ucode,0b00001111); amp=start_t(k+1)+double(m)*width_t(k+1)+width_t(k+1)/2; if code<=128 amp=-amp; else amp=amp; end end