CWDSP1.ReFFT RealData, RealSpec, ImgData CWDSP1.ReFFT RealData, RealSpecA, ImgDataA CWDSP1.ReFFT RealData, RealSpecV, ImgDataV CWDSP1.ReFFT RealData, RealSpecS, ImgDataS '====================== Dim fValue As Single Dim TotalfValue1 As Double Dim TotalfValue2 As Double For n = 0 To gnCount - 1 fValue = RealSpec(n) RealSpecA(n) = RealSpec(n) ImgDataA(n) = ImgData(n) ' RealSpec(n) = Sqr(RealSpec(n) * RealSpec(n) + ImgData(n) * ImgData(n)) / gnCount * 20.15982721 RealSpec(n) = 2 * Sqr(RealSpec(n) * RealSpec(n) + ImgData(n) * ImgData(n)) / gnCount '* (1000 / 10.16) Next RealSpec(0) = 0 For n = 0 To UBound(RealSpec) '第n个频率点对于的频率值 ' RealData(n) = n / (1 * UBound(RealSpec))* frequency RealData(n) = n * (frequency / (1 + UBound(RealSpec))) 'frequency 'Pacer.Value '1# * 50 / (0.001 * (liloop + 1)) Next '显示加速度波形 CWGFrequencey.Axes(2).Caption = "加速度" CWGFrequencey.Axes(1).AutoScale = True '设置幅频波形的最大频率 CWGFrequencey.Axes(1).Maximum = 2000 CWGFrequencey.PlotXvsY RealData, RealSpec '设置幅频波形的最大频率 CWGFrequencey.Axes(1).Maximum = 2000 CWGFrequencey.Refresh ' TestVIBData '////////////统计加速度 速度 位移 (最大值,有效值)(有效值,峰值)////////////////////////////// For n = 1 To gnCount - 1 If RealData(n) <> 0 Then '速度的实轴 和 虚轴 RealSpecV(n) = 1000 * ImgDataA(n) / (2 * Pi * RealData(n)) ImgDataV(n) = -1000 * RealSpecA(n) / (2 * Pi * RealData(n)) '位移的实轴 和 虚轴 RealSpecS(n) = -1000 * RealSpecA(n) / ((2 * Pi * RealData(n)) * (2 * Pi * RealData(n))) ImgDataS(n) = -1000 * ImgDataA(n) / ((2 * Pi * RealData(n)) * (2 * Pi * RealData(n))) End If Next '快速傅里叶逆变换求出速度 CWDSP1.ReInvFFT RealSpecV, ImgDataV, RealDataV If InStr(AfxPkModelParameter.strProjectParameter(6), "最大值") <> 0 Then Call CWArray1.MaxMin1D(RealDataV, fMax, nMaxIndex, fMin, nMinIndex) TestReturnVIBData(1, 1) = fMax '提取每次测试的最大值 If TestVIBData(1, 0) <= fMax Then TestVIBData(1, 0) = fMax End If Else TotalfValue0 = 0 For n = 0 To UBound(RealData) TotalfValue0 = TotalfValue0 + RealDataV(n) * RealDataV(n) Next If UBound(RealDataV) > 1 Then TestReturnVIBData(1, 1) = Sqr((TotalfValue0) / (UBound(RealDataV) - 1)) Else TestReturnVIBData(1, 1) = 0 End If '统计有效值 TestVIBData(1, 1) = TestVIBData(1, 1) + TestReturnVIBData(1, 1) End If '快速傅里叶逆变换求出位移 CWDSP1.ReInvFFT RealSpecS, ImgDataS, RealDataS If InStr(AfxPkModelParameter.strProjectParameter(6), "最大值") <> 0 Then Call CWArray1.MaxMin1D(RealDataS, fMax, nMaxIndex, fMin, nMinIndex) TestReturnVIBData(2, 1) = (fMax + fMin) * 1000 '提取每次测试的最大值 If TestVIBData(2, 0) <= TestReturnVIBData(2, 1) Then TestVIBData(2, 0) = TestReturnVIBData(2, 1) End If Else TotalfValue0 = 0 For n = 0 To UBound(RealData) TotalfValue0 = TotalfValue0 + RealDataS(n) * RealDataS(n) Next If UBound(RealDataS) > 1 Then TestReturnVIBData(2, 1) = 2 * 1000 * Sqr((TotalfValue0) / (UBound(RealDataS) - 1)) Else TestReturnVIBData(2, 1) = 0 End If '统计有效值 TestVIBData(2, 1) = TestVIBData(2, 1) + TestReturnVIBData(2, 1) End If
https://wenku.baidu.com/view/2592349a76eeaeaad1f330bc.html
https://wenku.baidu.com/view/4e5efed0d15abe23482f4de3.html
说到噪声,我想起了频谱分析的问题。稍微有些信号分析常识的工程师都知道要滤波,可是对于要滤除什么波,噪声从哪来却未必清楚,即使在获得频谱分析结果后,有些人仍然会问我,怎么纵坐标的数值不是想要的数值呢?为什么不是频率?大家当然需要知道,其实横坐标就是采样点数,并不是什么频率,频率其实是一个标量,或是一个无量纲量,通常情况下,我们把频率归一化到0~1范围内。
而由采样定理可知,采样频率应该是原始信号最高频率的2倍,即如果采样50Hz工频交流电,那么最低采样频率应该是100Hz,LabWindows/CVI中的傅里叶变换(FFT),将呈现出以0~99为横坐标的频谱。由于FFT的对称性,我们只要关心横坐标的0~49就可以了,50~99为0~49的镜像,然后,再经过细微变换,把横坐标值转换为1~50就可以了。
然而,FFT通常要求采样点数为2的n次方,因此,50 Hz工频交流电的最低采样频率(速率)应为每秒128个点(128Hz),在进行FFT计算后,只要将横坐标的0~63转换为1~64再显示出来就好了。如果每秒采样2次,那么能显示的最高频率也就是1Hz,无论你采集了到底是100个点还是1000个点。
事实上,FFT一般情况下在各个频率段内都会有值存在,这是由于信号在采集过程中进行了时域截断处理,而造成的频谱分布的各态历经效果。但是,波形的高低及与横轴围成的面积决定了其能量的大小,对于频谱(或称为频谱密度函数),其能量的集中程度与集中范围才是我们最关心的。滤波操作其实就是对不需要的那部分能量进行短路处理,处理的结果是使其不经过负载设备,如果是软件滤波,就是让那些不需要的能量在计算中不被处理或以零的方式进行计算。
因此,FFT的本质就是找到信号的能量分布特征波形,滤波的本质就是对不需要的那部分能量特征波形进行旁(短)路处理,使其消失。说白了就一句话,滤波是对能量分布的一种再分配,即能量处理方式。