在LabVIEW中依次输入一列数并绘图显示

在扭转刚度实验中,需逐次增加悬挂砝码重量,并用编码器记录各组重量对应的轴扭转变形量,手动将重量值输入程序,计算、绘图显示刚度曲线。在LabVIEW中依次输入一列数并绘图显示的程序框图如下:

在LabVIEW中依次输入一列数并绘图显示

使用事件结构,“添加”按钮触发将新一组的数据添加到数组中并在XY图中显示,在While循环中使用移位寄存器储存实验中的一列多组数据,达到依次连续绘图的目的。

使用到的LabVIEW函数位置分别为:

  • 编程 > 结构 > While循环
  • 编程 > 结构 > 事件结构
  • 编程 > 簇、类与变体 > 捆绑
  • 编程 > 数组 > 创建数组

长宽等比例缩小图片尺寸JavaScript代码

网站中调用大尺寸图片时,常需要控制图片的最大长度或宽度。在文章后台管理不具备上传图片尺寸裁剪功能,或者是网站客户上传图片未控制尺寸时,需要在图片调用时长宽等比例缩小图片尺寸。下面是JavaScript函数,其中参数FitWidth和FitHeight分别为缩小至的最大长度和宽度:

function FitImage(ImgD,FitWidth,FitHeight){
  var image=new Image();
  image.src=ImgD.src;
  if(image.width>0 && image.height>0){
    if(image.width/image.height>=FitWidth/FitHeight){
      if(image.width>FitWidth){
        ImgD.width=FitWidth;
        ImgD.height=(image.height*FitWidth)/image.width;
      }else{
        ImgD.width=image.width;
        ImgD.height=image.height;
      }
    }else{
      if(image.height>FitHeight){
        ImgD.height=FitHeight;
        ImgD.width=(image.width*FitHeight)/image.height;
      }else{
        ImgD.width=image.width;
        ImgD.height=image.height;
      }
    }
  }
}

调用方法,在图片中添加onload触发事件,使函数FitImage在图像加载完成后立即执行,下例中缩小至的最大长度和宽度为150和80px:

<img src="big-size-picture.jpg" onload="FitImage(this,150,80);" />

在LabVIEW中进行FFT快速离散傅里叶变换

在LabVIEW中进行FFT快速离散傅里叶变换的程序框图如下:

LabVIEW快速离散傅里叶变换FFT程序框图

首先构造示例周期信号,其5个参数由上至下依次为:频率、幅值、初始相位、每秒采样率、采样数。其中每秒采样率和采样数对FFT结果的影响见文章:用MATLAB演示采样频率和点数对FFT的影响

在LabVIEW中计算输入序列X的快速离散傅里叶变换后,需要把复数分解为极坐标分量得到振幅,即求:

r = |z| = sqrt(a² + b²)

其计算结果还需乘以2除以采样点数才可以得到真实振幅。

采样点数可以直接引取#s值,而对于非构造的实际未知信号,可以先获取波形成分中的Y值,再计算数组大小得到。

FFT频谱图具有对称性,使用数组子集显示一半即可。

使用到的LabVIEW函数位置分别为:

  • 信号处理 > 波形生成 > 正弦波形
  • 信号处理 > 变换 > FFT
  • 编程 > 数组 > 数组子集
  • 编程 > 数组 > 复数 > 复数至极坐标转换
  • 编程 > 簇、类与变体 > 捆绑
  • 编程 > 波形 > 获取波形成分
  • 编程 > 数组 > 数组大小

用MATLAB演示采样频率和点数对FFT的影响

FFT是指离散傅里叶变换的快速算法,可将时域信号变换为频域。

在MATLAB中做FFT,首先编写函数,对不同的采样频率和采样点数,计算FFT后的频率序列及其对应的幅值:

function [f amplitude] = yopheeFFT(sampleRate,FFT_points)
  n = 0:FFT_points-1;
  t = n/sampleRate; %采样时间序列
  f_All = n*sampleRate/FFT_points; %频率序列

  %构造混有噪声的周期信号并采样
  signal = 2*sin(2*pi*10*t)+1*sin(2*pi*20.25*t)+0.2*randn(size(t));

  %对信号进行快速Fourier变换,并求振幅
  amplitude_All = abs(fft(signal,FFT_points))*2/FFT_points;

  f = f_All(1:FFT_points/2);
  amplitude = amplitude_All(1:FFT_points/2);

其中时域信号为幅值2、频率10Hz和幅值1、频率20.25Hz的两个正弦信号和一个噪声信号的叠加。

指定不同的采样频率和采样点数,调用函数做FFT计算,并绘图显示:

sampleRate = 32; %采样频率
FFT_points = 64; %采样点数
[f amplitude] = yopheeFFT(sampleRate,FFT_points);
plot(f,amplitude);

sampleRate = 64;
FFT_points = 64;
[f amplitude] = yopheeFFT(sampleRate,FFT_points);
plot(f,amplitude);

sampleRate = 64;
FFT_points = 512;
[f amplitude] = yopheeFFT(sampleRate,FFT_points);
plot(f,amplitude);

采样频率和点数对FFT的影响

图片上方为时域信号。下左图采样频率低于信号成分最高频率的2倍,未识别出信号中20.25Hz的频率成分,并且出现混叠。下中图频率分辨率为1Hz,将20.25Hz识别为20Hz。

总结:

  • FFT频谱图具有对称性,显示一半即可
  • FFT计算结果乘以2除以采样点数得到真实振幅
  • FFT频率分辨率 = 采样频率 / 采样点数
  • 采样频率应大于信号中最高频率的2倍

LabVIEW求一列数前后两数的差值

通过数据采集卡采集光栅式转角编码器的脉冲信号,在LabVIEW软件中用固定的时间间隔读取一系列脉冲数,接着计算电机转速时,需要计算此脉冲序列前后两数的差值,LabVIEW软件中没有现成函数,故编写如下:

LabVIEW求一列数前后两数的差值

先计算数组大小,在For循环中使用索引数组不断循环引用各组前后两个数求差。

使用到的LabVIEW函数位置分别为:

  • 编程 > 数组 > 数组大小
  • 编程 > 结构 > For循环
  • 编程 > 数组 > 索引数组