最近的项目关于ADC的非线性误差分析,导师要求先用simulink仿真对比均匀量化和非均匀量化,之前没有接触过simulink和ADC,于是通过学习和查阅,我做了这样的模型:
最上方是通过量化器模拟均匀量化,中间用MATLAB Function代码写非均匀量化的算法,算法如下:
function y = nonlinear_adc_quantizer(u)
% 非线性量化阈值和对应的量化级别
% 假设输入信号的范围是[-1, 1]
% 量化区间: [32个量化级别,对应于一个5位ADC]
thresholds = linspace(-1, 1, 32); % 理想情况下应为均匀分布的阈值
% 引入非线性误差:人为打乱一些阈值的位置
% 这里简单地将中间部分的阈值密度加大,其他部分减小
% 0.1是调节非线性误差的因子,可自定义,决定阈值偏移,因子越大误差越明显
nonlinearity = 0.1 * sin(2 * pi * thresholds); % 非线性误差函数
thresholds = thresholds + nonlinearity;
% 量化级别: 这里简单地使用阈值的中点作为量化级别
levels = (thresholds(1:end-1) + thresholds(2:end)) / 2;
% 初始化输出向量
y = zeros(size(u));
% 量化过程
for i = 1:length(thresholds)-1