声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6222|回复: 10

[VB] 用VB实现FFT信号分析的程序分享

[复制链接]
发表于 2008-1-28 15:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我不知道怎么上传附件,只好把程序粘贴了过来。界面的话根据程序自设吧,要改函数在最后。
  1. Dim FUZHI(255), PINZHIr(255), PINZHIi(255), PINZHI(255) As Double
  2. Dim TU_DATA(2047) As Integer
  3. Dim P_START, I_TIME, P_POINT As Integer
  4. Dim PAI, A1, A2, A3, S1, S2, S3 As Double
  5. Dim fr(7, 255) As Double
  6. Dim fi(7, 255) As Double
  7. Dim Shuxu(255) As Integer
  8. Dim TX As Integer
  9. Private Sub Command1_Click()
  10. '启动,设置初始值
  11. I_TIME = 0
  12. P_START = 0
  13. Picture1(0).Cls
  14. Picture1(1).Cls
  15. Picture1(0).Visible = True
  16. Picture1(0).Line (6400, 1200)-(0, 1200), RGB(255, 0, 0)
  17. Timer1.Enabled = True
  18. End Sub

  19. Private Sub Command2_Click()
  20. End
  21. End Sub

  22. Private Sub Command3_Click()
  23. '频谱图形显示方式
  24. TX = (TX + 1) Mod 2
  25. End Sub

  26. Private Sub Form_Load()
  27. TX = 0
  28. PAI = 3.14159
  29. Timer1.Enabled = False
  30. '加权系数W
  31. For i = 0 To 7
  32. For j = 0 To 2 ^ i - 1
  33. aa = Cos(2 * PAI * j / 2 ^ (i + 1))
  34. Call ZHENG(aa)
  35. fr(i, j) = aa
  36. fr(i, j + 2 ^ i) = -aa
  37. bb = Sin(2 * PAI * j / 2 ^ (i + 1))
  38. Call ZHENG(bb)
  39. fi(i, j + 2 ^ i) = bb
  40. fi(i, j) = -bb
  41. Next j
  42. Next i

  43. '倒序
  44. For i = 0 To 255
  45. Shuxu(i) = 0
  46. For j = 0 To 7
  47. a = i And (2 ^ (7 - j))
  48. If a > 0 Then a = 1
  49. Shuxu(i) = Shuxu(i) + a * (2 ^ j)
  50. Next j
  51. Next i
  52. Label12.Caption = "截止窗" + Str(Int((HScroll6.Value / 256) * 100) / 100)
  53. End Sub

  54. Private Sub HScroll1_Change()
  55. '合成谐波信号的频率
  56. A1 = HScroll1.Value / 2
  57. Label5.Caption = A1
  58. End Sub

  59. Private Sub HScroll2_Change()
  60. '合成谐波信号的相位
  61. S1 = HScroll2.Value * PAI / 180
  62. Label6.Caption = HScroll2.Value
  63. End Sub

  64. Private Sub HScroll3_Change()
  65. '合成谐波信号的频率
  66. A2 = HScroll3.Value / 2
  67. Label7.Caption = A2
  68. End Sub

  69. Private Sub HScroll4_Change()
  70. '合成谐波信号的相位
  71. S2 = HScroll4.Value * PAI / 180
  72. Label8.Caption = HScroll4.Value
  73. End Sub
  74. Private Sub HScroll6_Change()
  75. Label12.Caption = "截止窗" + Str(Int((HScroll6.Value / 256) * 100) / 100)
  76. End Sub

  77. Private Sub HScroll7_Change()
  78. '合成谐波信号的相位
  79. S3 = HScroll7.Value * PAI / 180
  80. Label18.Caption = HScroll7.Value
  81. End Sub

  82. Private Sub HScroll8_Change()
  83. '合成谐波信号的频率
  84. A3 = HScroll8.Value / 2
  85. Label19.Caption = A3
  86. End Sub

  87. Private Sub Timer1_Timer()
  88. Call shuju
  89. P_POINT = I_TIME Mod 256
  90. FUZHI(P_POINT) = TU_DATA(I_TIME) / 100
  91. If I_TIME > 255 Then Call FFT 'begin FFT
  92. If P_START = 0 Then Picture1(0).PSet (0, 1200 - TU_DATA(I_TIME))
  93. If P_START <= 256 Then Picture1(0).Line -(P_START * 25, 1200 - TU_DATA(I_TIME)), RGB(128, 255, 2550)
  94. If P_START > 256 Then P_START = 256: Call pic_draw
  95. I_TIME = (I_TIME + 1) Mod 2048
  96. P_START = P_START + 1
  97. End Sub
  98. Private Sub FFT()
  99. Dim H(255), G(255) As Double

  100. '将采集数据按倒序结果赋值
  101. For i = 0 To 255
  102. kk = (Shuxu(i) + P_POINT + 1) Mod 256
  103. PINZHIr(i) = FUZHI(kk)
  104. PINZHIi(i) = 0
  105. Next i

  106. 'FFT
  107. For k = 0 To 7               '变换次数:8次*256
  108. Ai = 2 ^ k
  109. For i = 0 To 2 ^ (7 - k) - 1 '分组的组个数:128、64、32、16、8、 4、 2、  0
  110. Bi = 2 * i * Ai
  111. For j = 0 To 2 ^ (k + 1) - 1 '每组数据个数:2、  4、  8、16、32、64、128、256
  112. Ci = Bi + j
  113. If j < Ai Then
  114.    H(Ci) = PINZHIr(Ci) + fr(k, j) * PINZHIr(Ci + Ai) - fi(k, j) * PINZHIi(Ci + Ai)
  115.    G(Ci) = PINZHIi(Ci) + fi(k, j) * PINZHIr(Ci + Ai) + fr(k, j) * PINZHIi(Ci + Ai)
  116. Else
  117.    H(Ci) = PINZHIr(Ci - Ai) + fr(k, j) * PINZHIr(Ci) - fi(k, j) * PINZHIi(Ci)
  118.    G(Ci) = PINZHIi(Ci - Ai) + fr(k, j) * PINZHIi(Ci) + fi(k, j) * PINZHIr(Ci)
  119. End If
  120. Next j
  121. Next i
  122. For w = 0 To 255
  123. PINZHIr(w) = H(w)
  124. PINZHIi(w) = G(w)
  125. Next w
  126. Next k

  127. Picture1(1).Cls
  128. Picture1(1).PSet (0, 2300)
  129. For j = 0 To 127
  130. PINZHI(j) = (PINZHIr(j) * PINZHIr(j) + PINZHIi(j) * PINZHIi(j)) ^ 0.5
  131. Call ZHENG(PINZHI(j))
  132. If TX = 0 Then Picture1(1).Line -(100 * j, 2300 - PINZHI(j) * 5), RGB(255, 0, 0)
  133. If TX = 1 Then Picture1(1).Line (100 * j, 2300)-(100 * j, 2300 - PINZHI(j) * 5), RGB(255, 0, 0)
  134. Next j
  135. '横坐标点
  136. For j = 0 To 12
  137. Picture1(1).Circle (j * HScroll6.Value * 1000 / 256, 2300), 20, RGB(255, 0, 0)
  138. Next j
  139. End Sub
  140. Private Sub pic_draw()
  141. Picture1(0).Cls
  142. Picture1(0).Line (0, 1200)-(6400, 1200), RGB(255, 0, 0)
  143. Picture1(0).PSet (6400, 1200 - TU_DATA(I_TIME))
  144. For i = 1 To 256
  145. kk = (I_TIME - i + 2048) Mod 2048
  146. Picture1(0).Line -(6400 - i * 25, 1200 - TU_DATA(kk)), RGB(128, 255, 2550)
  147. Next i
  148. End Sub
  149. Sub shuju()
  150. xx2 = 128 / (Int((HScroll6.Value / 256) * 100) / 100)
  151. xx = 3 * Sin(A1 * PAI * I_TIME / xx2 + S1) + 2 * Cos(A2 * PAI * I_TIME / xx2 + S2) + Sin(A3 * PAI * I_TIME / xx2 + S3)
  152. Call ZHENG(xx)
  153. TU_DATA(I_TIME) = xx * 100
  154. End Sub
  155. Sub ZHENG(xx)
  156. If Abs(xx) < 0.00001 Then xx = 0
  157. xx = Int(xx * 100000 + 0.5) / 100000
  158. End Sub
复制代码

[ 本帖最后由 风花雪月 于 2008-1-29 15:02 编辑 ]

评分

4

查看全部评分

回复
分享到:

使用道具 举报

发表于 2008-2-5 09:28 | 显示全部楼层
收藏了。
发表于 2008-2-19 16:08 | 显示全部楼层
 楼主| 发表于 2008-2-22 17:42 | 显示全部楼层
我晕啊,不能上传.frm(VB)格式的文件。
发表于 2008-3-5 10:51 | 显示全部楼层
原帖由 dragoon0114 于 2008-2-22 17:42 发表
我晕啊,不能上传.frm(VB)格式的文件。


呵呵,现在文件格式多了去了,论坛只能上传特定几个扩展名的文件
发表于 2008-5-8 10:10 | 显示全部楼层
你好,我想知道这段代码是做什么用的

'加权系数W
For i = 0 To 7
For j = 0 To 2 ^ i - 1                     
aa = Cos(2 * PAI * j / 2 ^ (i + 1))
Call ZHENG(aa)
fr(i, j) = aa
fr(i, j + 2 ^ i) = -aa
bb = Sin(2 * PAI * j / 2 ^ (i + 1))
Call ZHENG(bb)
fi(i, j + 2 ^ i) = bb
fi(i, j) = -bb
Next j
Next i

Sub ZHENG(xx)
If Abs(xx) < 0.00001 Then xx = 0
xx = Int(xx * 100000 + 0.5) / 100000
End Sub

还有啊,怎么确定采样点数是256呢?
发表于 2008-5-17 20:00 | 显示全部楼层
能不能把程序贴出来啊?
有用啊
发表于 2011-1-5 20:54 | 显示全部楼层
正需要相关程序呢,分享了
发表于 2011-3-18 23:19 | 显示全部楼层
回复 4 # dragoon0114 的帖子

麻烦楼主给控件截个图呗,知道怎样安排就好做了,万分感谢!
发表于 2011-7-28 12:17 | 显示全部楼层
先收藏了,谢谢提供。
发表于 2014-11-17 22:47 | 显示全部楼层
谢谢提供
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-25 15:43 , Processed in 0.073854 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表