量化器matlab实现

量化器用于将连续的数据转换为离散的序列,因此这个过程必定是有损的,此系统误差称为量化噪声.

均匀量化器

function [ code,mistake ] = QuantierEncode( audio,M )
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
%   输入单声道信号,量化电平级数为M
%   对输入信号进行均匀量化并将量化结果转化为NRZ bianry序列
%   返回二进制编码序列和每位量化误差
    
    len=length(audio);
    %[最小值,最大值]为量化区间
    peak=max(audio);
    least=min(audio);
    %将区间分为M-1个部分,得到M个标志位
    q=(peak-least)/(M-1);
    QuantizerNum=least:q:peak
    
    %将输入信号的每个电平值映射到量化标准值
    index=zeros(1,len);mistake=zeros(1,len);
    for ele=1:len
        if audio(ele)== peak;
            index(ele)=M;
            continue;
        end
        
        %二分查找不小于当前电平值的标志位
        Left=1;Right=M+1;
        while Right-Left>1
            mid=Left+fix((Right-Left)/2);
            if QuantizerNum(mid)> audio(ele)
                Right=mid;
            else
                Left=mid;
            end
        end
        
        
        %比较上下标志位的误差,选择误差较小的标志位作为映射值
        %并得到量化误差
        if abs(QuantizerNum(Left)-audio(ele))>abs(QuantizerNum(Left+1)-audio(ele))
            index(ele)=Left+1;
            mistake(ele)=QuantizerNum(Left+1)-audio(ele);
        else
            index(ele)=Left;
            mistake(ele)=QuantizerNum(Left)-audio(ele);
        end
    end
    
    %选择码长
    N=ceil(log2(M-1))+1;
    code=zeros(len,N);
    %将电平序号转化为二进制编码
    for ele=1:len
        for pos=N:-1:1
            if mod(index(ele),2)==1
                code(ele,pos)=1;
            end
            index(ele)=fix(index(ele)/2);
            if index(ele)==0
                break;
            end
        end
    end
    
    
end


注意:在比较两标志位时,应比较当前值与两标志位间的距离,因此需要加abs.

性能评价

NULL

非均匀量化器

发布了161 篇原创文章 · 获赞 170 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/white_156/article/details/102925793