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的本质就是找到信号的能量分布特征波形,滤波的本质就是对不需要的那部分能量特征波形进行旁(短)路处理,使其消失。说白了就一句话,滤波是对能量分布的一种再分配,即能量处理方式。

posted on 2020-09-06 14:22  Gu  阅读(690)  评论(0编辑  收藏  举报