随笔 - 435  文章 - 0  评论 - 111  阅读 - 62万 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
        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   Gu  阅读(787)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示