信号的采集及其频率和频谱测量
一 实验目的
1 学习在CVI环境里面使用非NI数据采集卡。
2 学习用过零法计算被测每个周期采样点数。pot
3 学习数据采集卡采样间隔的测定。
4 学习计算被测信号的频率和周期。
5 熟悉FFT算法原理。
二 实验原理
CVI环境里非NI数据采集卡的驱动
1.1在CVI编辑器中将库文件PCI_Dask.lib添加到工程中。
1.2非NI数据采集卡头文件的添加
在CVI源文件编辑器中添加 #include "Dask.h" ,如下图所示
#include <analysis.h>
#include <cvirte.h>
#include <urint.h>
#include "频率.h" //在此添加
#include "Dask.h"
#define MAX 9216
static int panelHandle;
I16 CardID;lfish
2零计数法测频率原理
不含直流分量的正弦波每个周期内都应该有两个过零点,根据每两个过零点之间的采样次数我们可以得到每个周期的采样点数N,由于采样时间间隔△t是由数据采集卡决定的,是一个确定值。所以可以得到正弦波的周期为N*△t,,从而可以计算出频率f.
对被测信号x(t)进行数据采集,得到被测信号序列为x(n),n=1,2,3….k。我们把该信号序列中上次采样为负值,本次采样为正值的点记为正过零点,两个正过零点的时间间隔t为:
T=k△t
△t-------采样时间间隔
k--------两次过零点时间内采样的次数
t-------两个过零点之间的时间间隔
则被测波形的频率f为:
F=1/t=1/( k△t)
3虚拟示波器的基本原理
实测是指该虚拟仪器可以测量实际的信号,这时需要数据采集卡,将所测得电量信号采集到计算机中,由软件完成波形的显示。
如下图所示
由计算机对数据采集卡发出指令,启动采集卡,计算机将采集到的信号数据进行存储,处理和显示,从而实现虚拟示波器。
4PCI_9119数据采集卡使用方法
性能指标:
16路单端模拟输入通道:
A/D采样速率100KHz:
欧佩克是什么意思模拟输入电压范围为±10V, ±5V, ±2.5V, ±1.25V, ±0.625V
held3种A/D触发方式,软件触发,外部脉冲触发和可编程定时触发。
三 程序设计和实验内容
编写波形采集程序,在CVI中设计的简单仪器面板中的波形显示和信号频率界面如下
在仪器面板中,添加一个波形显示GRAPH控件,一个edit numeric 控件channel,一个
NUMERIC控件显示被测信号的频率,两个command button 按钮,分别控制采集的开始和停止。
四 信号频谱分析的主程序流程图
主程序框图
快速傅里叶变换FFT
(1)FFT不是一种新的变换,而是DFT的快速算法。
(2)直接DFT计算的复杂度:
计算DFT需要:次复数乘法;次复数加法。
(3)FFT算法推导:
(i) 第L次迭代中对偶结点值的计算公式为:
,是循环控制变量。
(ii) 对偶结点的关系如图2所示:
图2 FFT中对偶结点关系图
(i)旋转因子:被称为旋转因子,可预先算好并保存。
(ii)整序:经过r次迭代后,得到结果,实际结果应是,所以流程的最后一步是按下标的正常二进制顺序对结果进行整序。
(4)FFT算法特点:()
(i)共需次迭代;
(ii)第次迭代对偶结点的偶距为,因此一组结点覆盖的序号个数是。
(iii)第次迭代结点的组数为。
(iv)可以预先计算好,而且的变化范围是。
(5)FFT算法流程:()
(i)初始化:;
(ii)第次迭代:
(a)下标控制变量初始化;
(b)“结点对”的个数初始化;
(c)
按对偶结点对的计算公式进行置位运算,得到和的值;
;;
跳过已经计算过的结点(即上面所对应的那些结点):;
如果,转到b)继续计算下一组结点;否则结束本次迭代。
(iii)当次迭代全部完成后,对结果按下标二进制位进行整序,从而得到结果。
(6)FFT算法复杂度分析:(,预先算好)
(i)一个对偶结点对的计算需要2次复数加法和1次复数乘法
(ii)对任一次迭代,共有N/2对结点,因此共需N次复数加法和N /2次复数乘法
(iii)次迭代的总计算量为:复数加法次数,复数乘法次数为
(iv)算法复杂度为
IDFT同样可用FFT实现,算法复杂度也是。
过零法计算频率的程序代码如下:
#include <analysis.h>
#include <cvirte.h>
#include <urint.h>
#include "频率.h"
#include "Dask.h"
#define MAX 9216
static int panelHandle;
I16 CardID;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
英语口试自我介绍 return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "频率.uir", PANEL)) < 0)
return -1;
CardID=Register_Card(PCI_9111DG,0);
AI_9111_Config (CardID,TRIG_INT_PACER,0,9216);
AI_AsyncDblBufferMode(CardID, 0);
DisplayPanel (panelHandle);
RunUrInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK BEGIN (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
小学英语教学质量分析{
U16 volt1[MAX]={0};
U16 chanel=0,i=0,adRange=AD_B_5_V;
U32 ReadCount = MAX;
F64 SampleRate =100000.0;
U16 SyncMode =1;
double volt2[MAX]={0},volt3[MAX/2]={0},volt4[MAX/2]={0},f;
double volt5[256]={0};nothing compares 2 u
int stpo,sumpo,signpo[10]={0},k=0;
int channel;
switch (event)shipment
{
ca EVENT_COMMIT:
GetCtrlVal(panelHandle,PANEL_channel,&channel);
AI_ContReadChannel (CardID, channel, adRange,volt1, ReadCount, SampleRate, SyncMode);
google apps
for (i=0;i<MAX;i++) {
volt2[i]=volt1[i]*10.0/0xffff-5;
if (volt2[i]<0) volt2[i] = volt2[i] + 10;
volt2[i]=volt2[i]-5; }
for (i=1;i<MAX;i++) {
if ((volt2[i-1]*volt2[i]<=0)&&(volt2[i-1]<0)) {
signpo[k]=i;k++;
if (k>8) break;} }
少儿英文歌曲 sumpo = signpo[k-1]-signpo[0];
f= 100000.0/sumpo*(k-1);
SetCtrlVal (panelHandle, PANEL_NUMERIC, f);
DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1, VAL_IMMEDIATE_DRAW);
if ((sumpo*5)>MAX)
PlotY (panelHandle, PANEL_GRAPH, volt2, MAX, VAL_DOUBLE, VAL_FAT_LINE, VAL_EMPTY_SQUARE,