今天写主要来编的程序就是咱们AD变换的两个步骤。一个是采样,还有一个是量化。大家可以先看看,这一过程当中的信号是如何变化的。信号的变换图如下。
先说说采样,采样是将连续时间信号转换为离散时间信号的过程。在采样过程中,连续信号在特定时间间隔(采样间隔)内被测量和记录,这些时间间隔称为采样周期。采样率(或采样频率)是指每秒钟采样的次数,通常用赫兹(Hz)表示。采样是数字信号处理中的一个关键步骤,因为它将模拟信号转换为可以用数字设备(如计算机)处理的离散信号。大家在图上也能很明显的看出来,不知道大家还记不记得那个公式xₐ(nT)=x(n),每隔一定的距离在采一个值。在理想的采样中也可以写成模拟信号乘上冲激串,即。对应上面的概念,这里的T就是采样周期,fs=1/T就是采样频率。就先说这么多吧,我们看程序。
%采样信号的写法
%奈奎斯特采样定理的体现,过采样的优势
%注意使用“;”,抑制输出:当分号放在表达式后面时,运算后命令窗口中不显示表达式的计算结果。
clear all
close all
f = 10;
fs = 260;
%采样信号的写法
%第一种
t = 0:1/fs:1
signal1 = sin(2*pi*f*t);
%第二种
length = [0:300]
signal2 = sin(2*pi*f*length/fs);
figure(1)
plot(signal1,'-*')
figure(2)
plot(signal2,'-*')
这里可以有两种不同的写法,个人比较喜欢第二种。大家随便选,来看图像,这里建议用stem函数来看它的离散图像。大家感兴趣的可以数一下一个周期内正好为26个点
第二个概念是量化,量化是将模拟信号或连续取值的信号转换为有限个离散值的过程。在数字信号处理和通信中,由于数字系统只能处理离散的数值,所以需要对连续的模拟信号进行量化。量化通过将信号的取值范围划分成若干个区间(称为量化级),然后将落在每个区间内的信号值用一个特定的离散值(量化值)来表示。量化会引入量化误差,即量化后的信号值与原始信号值之间的差异。量化误差的大小取决于量化级的数量和量化方式。量化级越多,量化误差通常越小,但同时也会增加数据量和处理复杂度。在开始的图像当中,我们可以看到信号被分成一个阶梯函数,那样的就是我们的一个量化信号。大家在学AD转换的时候,或许会学到过量化阶数这一概念。这里的量化级数则是另一个和它相关的概念。量化级数和量化阶数是量化过程中的两个相关概念。量化级数是指量化后可能的取值个数。量化阶数则是相邻两个量化电平之间的差值。它们之间存在这样的关系:量化阶数 = 量化范围 / 量化级数。这里先给出一个简单的代码。仅供参考。
%量化信号
%
% 生成一个正弦波信号
t = 0:0.01:1; % 时间向量
x = sin(2 * pi * 5 * t); % 正弦波信号
% 定义量化参数
num_levels = 16; % 量化级数
q_levels = linspace(-1, 1, num_levels); % 量化级别
% 对信号进行量化
x_quantized = quantiz(x, q_levels);
% 绘制原始信号和量化信号
figure(1);
subplot(2, 1, 1);
plot(t, x);
xlabel('t/s');
ylabel('幅值');
title('原信号');
subplot(2, 1, 2);
stairs(t, x_quantized, 'r');
xlabel('t/s');
ylabel('幅值');
title('量化后的信号');
grid on;
% 显示量化级别
disp('量化级别:');
disp(q_levels);
% 量化函数定义
function y = quantiz(x, q_levels)
% 初始化量化后的输出信号
y = zeros(size(x));
% 对每个信号样本进行量化
for i = 1:length(x)
% 找到最接近的量化级别
[~, idx] = min(abs(q_levels - x(i)));
y(i) = q_levels(idx);
end
end
图像如下
当然在MATLAB当中,我们还可以使用向上取整或者是向下取整或者是四舍五入等等能够让信号归一到不同水平的电平上就行了。
更多的话,大家继续follow我吧。
欲知后事如何,且听下回分解。OVO.......