2. 离散信号基础:连续信号的离散化、采样定理、量化与编码

各位同学,大家好。欢迎来到《微机保护算法与实现精讲》的第二讲。

今天我们要聊的,是整个微机保护算法的地基——离散信号基础。你想想看,电力系统里的电压、电流,本质上都是连续变化的模拟量。但我们的微处理器,它只认0和1,只处理离散的数字。这中间到底发生了什么?

说白了,就是把一个连续的、光滑的模拟信号,硬生生地掰成一个个离散的点,再把这些点的数值用二进制表示出来。这个过程,就是我们今天要讲的离散化、采样、量化与编码

我个人习惯把这一章看作是“从模拟世界到数字世界的桥梁”。这座桥搭不好,后面所有的算法都是空中楼阁。我在项目里见过太多因为采样没搞对,导致保护误动或拒动的案例。嗯,咱们今天就把这个地基打牢。

2.1 连续信号的离散化

什么是连续信号?就是时间上连续、幅值上也连续变化的信号。比如我们电网里的50Hz正弦波,它就是典型的连续信号。

那离散化呢?就是只取某些特定时间点上的信号值。这个过程,我们叫它采样

你可以想象成用一台高速相机,每隔一小段时间给这个连续信号拍一张照片。拍下来的,就是那一瞬间的“快照”。这些快照,就是我们后续要处理的离散数据点。

这里有个关键点:采样频率。也就是你每秒拍多少张照片。拍得太慢,信号变化的信息就丢了;拍得太快,数据量太大,处理器忙不过来。

核心概念:离散化就是用一系列离散的时间点上的样本值,去近似表示一个连续的时间函数。

数学上可以表示为:x[n] = xa(nT),其中T是采样间隔,n是整数序号。

2.2 采样定理(奈奎斯特定理)

好,问题来了:我们到底该用多快的速度去采样?

这就引出了整个数字信号处理领域最核心的定理——奈奎斯特定理,也叫采样定理。

定理的内容其实很简单:采样频率必须大于或等于信号中最高频率分量的两倍

用公式表示就是:fs ≥ 2 * fmax

其中fs是采样频率,fmax是信号中包含的最高频率。

为什么会这样?我简单解释一下。如果采样频率不够高,就会发生一种叫做“混叠”的现象。高频信号会伪装成低频信号混进来,你根本分辨不出来。这在微机保护里是致命的——你以为是基波,结果是个高次谐波假扮的,保护逻辑一算,全错了。

⚠️ 避坑指南:我曾经在一个谐波分析项目里,采样频率只设了1kHz,结果把1500Hz的谐波混叠成了500Hz的信号。分析结果完全失真,查了三天才找到原因。从那以后,我设计采样系统时,一定会留出至少20%的裕量。

在电力系统保护中,我们通常采样50Hz的基波。但信号里往往含有高次谐波,比如3次、5次、7次,甚至更高。所以采样频率一般选在600Hz到1200Hz之间,也就是每周期12到24个点。对于需要分析高次谐波的场合,采样频率会更高。

应用场景 信号最高频率 推荐采样频率 每周期采样点数
工频保护(基波) 50 Hz 600 Hz 12
谐波分析(至13次) 650 Hz ≥ 1300 Hz ≥ 26
行波保护 数百kHz MHz级别

2.3 量化与编码

采样搞定了,我们拿到了一个个时间点上的电压值。但这些值还是模拟量,比如3.14159伏特。微处理器不认识这个,它只认识二进制数。

所以下一步,就是量化

量化,就是把连续变化的幅值,映射到有限个离散的等级上。比如我们用12位的ADC(模数转换器),它能把0到5V的电压范围分成4096个等级。每个等级对应一个数字码。

这里有个问题:量化误差。你想想看,3.14159V这个精确值,可能落在3.1416V和3.1412V这两个等级之间。你只能选一个近似的。这个近似带来的误差,就是量化误差。

量化误差的大小,取决于ADC的位数。位数越高,等级越多,误差越小。12位ADC的量化误差大约是满量程的1/4096,而16位的是1/65536。

💡 个人经验:在微机保护中,我建议至少使用12位的ADC。对于精度要求高的差动保护,16位是标配。别为了省那几块钱,牺牲了保护的可靠性。我在一个老项目里见过用10位ADC的,结果每次动作值都飘,根本没法整定。

量化之后,就是编码。编码就是把量化后的等级,用二进制数表示出来。比如量化等级1023,用12位二进制表示就是001111111111。

常见的编码方式有:

  • 自然二进制码:最直观,直接对应数值大小
  • 偏移二进制码:常用于双极性信号(有正有负的交流信号)
  • 补码:微处理器做算术运算时最方便

在电力系统保护中,交流信号是双极性的,所以常用偏移二进制码或补码。

2.4 离散时间信号的表示

经过采样、量化、编码,我们终于得到了微处理器能处理的离散时间信号

离散时间信号,通常用x[n]来表示。n是整数序号,代表第n个采样点。x[n]的值,就是那个采样点上的量化后的数值。

比如,我们采样一个50Hz正弦波,每周期采12个点,那么一个周期内的离散信号可以表示为:

x[0] = 0
x[1] = 0.5 * Vm
x[2] = 0.866 * Vm
x[3] = Vm
x[4] = 0.866 * Vm
x[5] = 0.5 * Vm
x[6] = 0
x[7] = -0.5 * Vm
x[8] = -0.866 * Vm
x[9] = -Vm
x[10] = -0.866 * Vm
x[11] = -0.5 * Vm

其中Vm是信号的幅值。你看,这就是一个完整的正弦波周期,被我们用12个离散点表示出来了。

在实际的微机保护程序中,这些数据会存储在一个数组里,比如:

// 定义一个采样数据缓冲区,存放一个周期的数据
#define SAMPLES_PER_CYCLE 12
int16_t sample_buffer[SAMPLES_PER_CYCLE];

// 假设ADC中断服务程序里,每次采样后存入缓冲区
void ADC_IRQHandler(void) {
    static uint8_t index = 0;
    sample_buffer[index] = ADC_GetValue();
    index = (index + 1) % SAMPLES_PER_CYCLE;
}

这段代码很典型。每次ADC转换完成,就把数据存到缓冲区里。缓冲区是循环的,存满12个点就覆盖最旧的那个。这样,我们随时都能拿到最近一个周期的数据。

总结一下:

  • 连续信号 → 采样 → 离散时间信号
  • 离散时间信号 → 量化 → 离散幅值信号
  • 离散幅值信号 → 编码 → 数字信号(二进制)

这三步,就是微机保护算法处理模拟量的完整流程。

好了,这一讲的内容就到这里。下一讲,我们会深入讨论数字滤波器,看看如何从这些离散数据中提取出我们想要的基波分量,滤除那些讨厌的噪声和谐波。

记住,采样是基础,基础不牢,地动山摇。回去好好消化一下奈奎斯特定理,下次课我会提问的。