采样定理及ATE波形采样原则

321 阅读5分钟

一. 奈奎斯特-香农采样定理

  • 如果一个系统以超过信号最高频率至少两倍的速率对模拟信号进行均匀采样,那么原始模拟信号就能从采样产生的离散值中完全恢复。为了防止由于混叠引起的信号被破坏,需要以奈奎斯特速率或更高的速率进行采样。如果不遵守这个基本要求,就无法消除混叠(混叠永久与原始频谱混合,两者无法区分)。
  • 一句话概括:要准确还原一个模拟信号,采样频率必须大于该信号中最高频率分量的2倍。 用数学公式表达就是:
fs>2×fmaxfs​>2×fmax​
  • 其中:fs​是采样率,单位是赫兹(Hz),表示每秒钟采集多少个数据点。 fmax​是你要采集的模拟信号中所包含的最高频率,单位也是赫兹(Hz)。2×fmax​这个值被称为“奈奎斯特频率”。
  • 在实际工程中,为了避免混叠,在ADC采样之前,必须加一个抗混叠滤波器,通常是一个低通滤波器,它的作用就是强行把信号中高于 fs​/2的频率成分滤除掉,确保进入采样器的信号满足 fmax​<fs​/2。

二.各个参数的含义与计算

  • 现在我们把这些参数联系起来。它们之间的关系非常直观。

1. 采样率

  • 定义:每秒钟采集的数据点数量。这是你首先需要确定的参数。

  • 如何确定采样率?

    • 根据定理:首先估算或知道你信号中的最高频率 fmax​,然后设定 fs​>2×fmax​。在实际工程中,为了留有余地和更好地重建波形,通常取 fs​=(5 到 10)×fmax​。
    • 举例:你要采集一个1kHz的正弦波。理论上 fs​>2kHz即可。但为了波形质量,你可能会选择10kHz甚至更高的采样率。

2. 采样间隔时间

  • 定义:采集两个相邻数据点之间的时间间隔。

  • 与采样率的关系采样间隔时间是采样率的倒数。

Δt=1/fsΔt=1/fs
  • 举例:如果采样率 fs​=10kHz=10,000Hz,那么采样间隔时间 Δt=1/10,000=0.0001s=100μs。这意味着每过100微秒,ADC就采集一个点。

3. 采样点数

  • 定义:一次完整的采集过程中,总共采集的数据点数量。它决定了你采集的“时长”

4. 总采样时间

  • 定义:采集完所有采样点数所花费的总时间。

  • 计算公式

Ttotal=N×Δt=N/fsTtotal​=N×Δt=​N/fs​
-   Ttotal​:总采样时间
-   N:采样点数
-   Δt:采样间隔时间
-   fs​:采样率

从公式可以看出,在采样率固定的情况下,采样点数直接决定了你能看到多长时间的信号

三.ATE实际应用举例

1.某LDO需要测PSRR,需要用AWG功能生成一个频率为1khZ,峰峰值为0.5V,直流偏置为4V的纹波,代码应该如何完成?

  • 根据以下公式:
freq(signal)=fs/N=1/Δt/Nfreq(signal)=fs/N=1/Δt/N
  • 其中fs为采样率,即采样间隔的倒数;N为一个周期内的采样点数
  • 利用AWG函数,可以用以下的代码实现:
int sam_1khz = 1000;//波形长度
int interval = 10;//采样间隔,单位us
double wave_data[10000] = { 0.0 };
o_VDD.Set(FV, 4.0, FOVI_10V, FOVI_100MA, RELAY_ON, 1); 
delay_ms(2);

//生成1000个点组成的10个周期的正弦波
STSAWGCreateSineData(&wave_data[0], sam_1khz, 10, 0.5, 4.0, 0); 
//-------------------- 1kHZ --------------------	
//命名正弦波为"AWG_1kHZ_4V",结果存放在wave_data数组中
o_VDD.AwgLoader("AWG_1kHZ_4V", FV, FOVI_10V, FOVI_100MA, wave_data, sam_1khz);
o_VDD.Set(FV, 4.0 FOVI_10V, FOVI_100MA, RELAY_ON);   

//设置波形开始-结束点,设置采样间隔(确定波形的频率)
o_VDD.AwgRun("AWG_1kHZ_4V ", 0, (sam_1khz - 1), 0, interval, AWG_LOOP);

//单独运行该段波形
STSEnableAWG(&o_VDD);
delay_ms(5); 

2.上述问题的PSRR怎么计算?

  • 对输出端利用ACM进行采样1024个点进行FFT计算(此处略);已知ATE的采样率为200kHZ,输入频率为1kHZ,那么可以得到:
1.计算频率分辨率
Δf=fs/N​​=200000/1024195.3125 HzΔf=fs/N​​=200000 / 1024 ​≈195.3125 Hz

2. 计算 1kHz 对应的谱线序号 k

FFT 的第 k条谱线对应的频率为:

freq(signal)=kΔffreq(signal)​=k⋅Δf

我们要找 fk​最接近 1000 Hz 的整数 k:

k=freq(signal)/Δf​​=1000/195.312510005.12k=freq(signal)/Δf​​=1000/195.31251000​≈5.12

3. 确定最接近的谱线

  • k=5:f5​=5×195.3125=976.5625 Hz,与 1000 Hz 相差 23.4375 Hz
  • k=6:f6​=6×195.3125=1171.875 Hz,与 1000 Hz 相差 171.875 Hz

显然 k = 5更接近 1kHz。


4. 代码实现

double m_psrr[MAX_SITE] = { 0 };
double m_vpeak[MAX_SITE] = { 0 };
acsm1.ACMGetFFTResult(LADC_VR_10V, DC_COUPLE, 1024, fft_result);	
delay_ms(6);//points * 5us fft_result

for (STID = 0; STID < MAX_SITE; STID++)
{
        //将FFT数组中的第5个点按工位取出
        m_vpeak[STID] = fft_result[STID * 1024 + 5] * 1e6;//uV
   
        if (m_vpeak[STID] <= 0)	
           m_psrr[STID] = 0;
        
        else
           //计算psrr的db形式
           m_psrr[STID] = 20 * log10(m_vpeak[STID] / 1e5);
        
	PSRR->SetTestResult(STID, 0, m_psrr[STID]);//dB
        
}

3.已知某块VI源板卡的AWG采样率为100kHZ,需要生成最快10kHZ的正弦波,请计算最多能采样几个点?

  • 根据公式
freq(signal)=fs/N=1/Δt/Nfreq(signal)=fs/N=1/Δt/N

计算得到N=fs/freq(signal)=10N=fs/freq(signal)=10;即一个周期只能采样10个点,这对于正弦波来讲失真度比较高,不推荐使用AWG功能来发该波形。