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个点就覆盖最旧的那个。这样,我们随时都能拿到最近一个周期的数据。
总结一下:
- 连续信号 → 采样 → 离散时间信号
- 离散时间信号 → 量化 → 离散幅值信号
- 离散幅值信号 → 编码 → 数字信号(二进制)
这三步,就是微机保护算法处理模拟量的完整流程。
好了,这一讲的内容就到这里。下一讲,我们会深入讨论数字滤波器,看看如何从这些离散数据中提取出我们想要的基波分量,滤除那些讨厌的噪声和谐波。
记住,采样是基础,基础不牢,地动山摇。回去好好消化一下奈奎斯特定理,下次课我会提问的。