找回密码
 欢迎注册
楼主: ysr

[讨论] 几个VB小程序

[复制链接]
发表于 2013-5-29 18:58:20 | 显示全部楼层
-10.993328883944023249699765318886
3.9966644419720116248498826594432917614691341389767918250399831407458936016591770 E0 +8.6544766818683163506484864487038110093137290377930209906096344044161329614064250 E0 i
3.9966644419720116248498826594432917614691341389767918250399831407458936016591770 E0 -8.6544766818683163506484864487038110093137290377930209906096344044161329614064250 E0 i
我正准备设计FFTvb 程序
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-6-1 12:04:36 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-1 15:00:39 | 显示全部楼层
如果不使用FFT快速乘除法,要提高运算的速度确不容易。虽然在定精度计算中我采用了多钟技巧,但在多位数超过512时不能令人满意。1024位Gamma函数我需要0.1秒以下,才可能对更多复杂函数快速计算。但这个目标还需要尝试。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-6-2 22:00:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-8 15:47:14 | 显示全部楼层
VB 编写的FFT(8点的基2FFT)
Ft=8
入口参数:数组 ax_sz()
出口参数: FFT_Nr()(实数部分) ;FFT_Ni() (虚数部分) 数据类型 Variant

Function FFT(ax_sz() As Variant)     'FFT2 傅里叶变换 2013-.6-08
Dim Ar(), Ai() As Variant
Dim x1(1, 8), x2(1, 8) As Variant
Dim x11(1, 8), x12(1, 8), x21(1, 8), x22(1, 8) As Variant
Dim Np, u, i As Integer
Np = Ft

ReDim Ar(Np), Ai(Np) As Variant
'Dim ax_sz(512)

x11(1, 0) = 0
x12(1, 0) = 0
x21(1, 0) = 0
x22(1, 0) = 0

x11(0, 1) = ax_sz(0)
x12(0, 1) = ax_sz(2)
x21(0, 1) = ax_sz(1)
x22(0, 1) = ax_sz(3)

x11(1, 1) = -ax_sz(4)
x12(1, 1) = -ax_sz(6)
x21(1, 1) = -ax_sz(5)
x22(1, 1) = -ax_sz(7)

x11(0, 0) = x11(0, 1) - x11(1, 1)
x12(0, 0) = x12(0, 1) - x12(1, 1)
x21(0, 0) = x21(0, 1) - x21(1, 1)
x22(0, 0) = x22(0, 1) - x22(1, 1)

'k=2
x11(0, 2) = x11(0, 1) + x11(1, 1)
x12(0, 2) = x12(0, 1) + x12(1, 1)
x21(0, 2) = x21(0, 1) + x21(1, 1)
x22(0, 2) = x22(0, 1) + x22(1, 1)

x11(1, 2) = x11(1, 0)
x12(1, 2) = x12(1, 0)
x21(1, 2) = x21(1, 0)
x22(1, 2) = x22(1, 0)

'k=3
x11(0, 3) = x11(0, 1)
x12(0, 3) = x12(0, 1)
x21(0, 3) = x21(0, 1)
x22(0, 3) = x22(0, 1)

x11(1, 3) = -x11(1, 1)
x12(1, 3) = -x12(1, 1)
x21(1, 3) = -x21(1, 1)
x22(1, 3) = -x22(1, 1)
'k=4
x11(0, 4) = x11(0, 0)
x11(1, 4) = x11(1, 0)

x12(0, 4) = x12(0, 0)
x12(1, 4) = x12(1, 0)
   
x21(0, 4) = x21(0, 0)
x21(1, 4) = x21(1, 0)
   
x22(0, 4) = x22(0, 0)
x22(1, 4) = x22(1, 0)

'FFT 值
x1(0, 0) = x11(0, 0) + x12(0, 0)
x1(1, 0) = 0
x2(0, 0) = x21(0, 0) + x22(0, 0)
x2(1, 0) = 0

x1(0, 4) = x11(0, 4) - x12(0, 4)
x1(1, 4) = 0
x2(0, 4) = x21(0, 4) - x22(0, 4)
x2(1, 4) = x1(1, 4)
For i = 1 To 3
    u = 32 * i Mod 256
    x1(0, i) = x11(0, i) + x12(0, i) * Sbi(0, u) - x12(1, i) * Sbi(1, u)
    x1(1, i) = x11(1, i) + x12(0, i) * Sbi(1, u) + x12(1, i) * Sbi(0, u)
   
    x1(0, 8 - i) = x1(0, i)
    x1(1, 8 - i) = -x1(1, i)
   
    x2(0, i) = x21(0, i) + x22(0, i) * Sbi(0, u) - x22(1, i) * Sbi(1, u)
    x2(1, i) = x21(1, i) + x22(0, i) * Sbi(1, u) + x22(1, i) * Sbi(0, u)
   
    x2(0, 8 - i) = x2(0, i)
    x2(1, 8 - i) = -x2(1, i)
Next
x1(0, 8) = x1(0, 0)
x1(1, 8) = x1(1, 0)
x2(0, 8) = x2(0, 0)
x2(1, 8) = x2(1, 0)

FFT_Nr(0) = x11(0, 0) + x12(0, 0) + x21(0, 0) + x22(0, 0)
FFT_Ni(0) = 0
FFT_Nr(4) = x1(0, 4)
FFT_Ni(4) = -x2(0, 4)

For i = 1 To 8
    u = 16 * i Mod 256
    FFT_Nr(i) = x1(0, i) + x2(0, i) * Sbi(0, u) - x2(1, i) * Sbi(1, u)
    FFT_Ni(i) = x1(1, i) + x2(0, i) * Sbi(1, u) + x2(1, i) * Sbi(0, u)

    FFT_Nr(Np - i) = FFT_Nr(i)
    FFT_Ni(Np - i) = -FFT_Ni(i)
Next
End Function
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-8 15:50:49 | 显示全部楼层
Sbi(0,u) 余弦函数 2πk/256 (k=0,1,.......,256)
Sbi(1,u) 正弦函数 2πk/256(k=0,1,........,256)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-8 17:00:23 | 显示全部楼层
FFT适用于有效数字很多的情况,对于像1024位精度的计算,FFT的效果并不好,如果优化的不是足够好,甚至没有分治法快。
  另外,VB并不适合做科学计算,如果想最求性能的话,C+汇编是更好的选择,建议楼主不妨学学C语言。如果我没有记错的话,站长在多年前写的等幂和计算器就是用VB做的,但是现在,站长已经把c语言和汇编用的非常熟练了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-8 17:22:58 | 显示全部楼层
27# liangbch


C语言曾学过,但太费脑子,我就是编着玩,如真的需要我会用C语言的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-6-11 21:31:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-14 14:22:40 | 显示全部楼层
FFT适用于有效数字很多的情况,对于像1024位精度的计算,FFT的效果并不好,如果优化的不是足够好,甚至没有分治法快。
  另外,VB并不适合做科学计算,如果想最求性能的话,C+汇编是更好的选择,建议楼主不妨学学C语 ...
liangbch 发表于 2013-6-8 17:00


FFT对于不太大的数据来说并非有益,尝试了一下1024位FFT的速度还不如硬乘快。采用了部分分治法结果反而有所效果,虽然不大可比硬乘好些。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-25 13:43 , Processed in 0.044836 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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