ニューメリカル・レシピのFFTプログラムをExcelのVBAに移植
ExcelのVBAで、サブルーチンに配列をそのまま渡せることを(いまさら)初めて知った。じゃあ、普通に配列渡して高速フーリエ変換(FFT)とか計算できるな、ってことで手元にあったニューメリカル・レシピ(in C)のCプログラムを移植してみた。
プログラムはこれです。↓
使い方は、上のを標準モジュールとして読み込んだ後、配列data()を使って
call FFT(data nn, isign)
と呼ぶんだけど、ちょっと使い方が変わっていて
data(1) = データ1のreal part,
data(2) = データ1のimag part
data(3) = データ2のreal part
data(4) = データ2のimag part
・・・
とか並べます。データnnまで(つまり配列としては2*nnは必要)。当然nnは2^Mの形です。
isignは+1ならフーリエ変換、-1なら逆フーリエ変換ですよ。
まあ、
Option Explicit
Private Sub CommandButton1_Click()
Dim data(16) As Double
Dim i As Integer
data(1) = 1#
data(2) = 0#
data(3) = 1#
data(4) = 0#
data(5) = 1#
data(6) = 0#
For i = 7 To 16
data(i) = 0
Next i
Call FFT(data, 8, 1)
For i = 1 To 16
Worksheets("Sheet1").Cells(i, 5) = data(i)
Next i
End Sub
Sub FFT(data() As Double, nn As Integer, isign As Integer)
Dim n As Integer, mmax As Integer, m As Integer, j As Integer, istep As Integer, i As Integer
Dim wtemp As Double, wr As Double, wpr As Double, wpi As Double, wi As Double, theta As Double
Dim tempr As Double, tempi As Double
Dim dummy As Double
n = 2 * nn
j = 1
For i = 1 To n - 1 Step 2
If j > i Then
dummy = data(i)
data(i) = data(j)
data(j) = dummy
dummy = data(i + 1)
data(i + 1) = data(j + 1)
data(j + 1) = dummy
End If
m = n / 2
While (m >= 2 And j > m)
j = j - m
m = m / 2
Wend
j = j + m
Next i
mmax = 2
While (n > mmax)
istep = mmax * 2#
theta = isign * (2# * 4# * Atn(1) / mmax)
wtemp = Sin(0.5 * theta)
wpr = -2# * wtemp * wtemp
wpi = Sin(theta)
wr = 1#
wi = 0#
For m = 1 To mmax - 1 Step 2
For i = m To n Step istep
j = i + mmax
tempr = wr * data(j) - wi * data(j + 1)
tempi = wr * data(j + 1) + wi * data(j)
data(j) = data(i) - tempr
data(j + 1) = data(i + 1) - tempi
data(i) = data(i) + tempr
data(i + 1) = data(i + 1) + tempi
Next i
wtemp = wr
wr = wtemp * wpr - wi * wpi + wr
wi = wi * wpr + wtemp * wpi + wi
Next m
mmax = istep
Wend
End Sub
こんな感じで使えばいいかな。間違っていても責任はもてまへん。。。
« ほとんど至るところほとんど至るところといわなきゃいけない。 | トップページ | 仁左衛門の湯 »
「パソコン・インターネット」カテゴリの記事
- RF Weekly Digest (Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2025/11/9-2025/11/16(2025.11.16)
- Visual Studio 2026がリリースされたので早速新しいPCにインストール。全面的にGitHub Copilotを使うようになっている。とりあえずC#でMath.NET numericsを使って連立方程式を計算するコードを書いてもらったら一発で動く。他の例として固有値や非線形計算もコードを出してくれた。(2025.11.14)
- 家で使うPCをゲーミングノートPC、ASUS TUF Gaming A16に買い替えた。CPUはAMD Ryzen 9 8940HX、メモリ32GB、GPUはNVIDIA GeForce RTX 5060 Laptop GPU、SSD 1TB。ゲームをしたいわけでなくてNVIDIAの最新GPUで機械学習・数値計算やろうかと。(2025.11.13)
- RF Weekly Digest (Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2025/11/3-2025/11/9(2025.11.09)
- RF Weekly Digest (Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2025/10/27-2025/11/3(2025.11.04)
「学問・資格」カテゴリの記事
- 高周波・RFニュース 2025年11月17日 Microwave Journalの特集は5G/6G/IoT, Special Focusも5G/6G、IDTechExの低損失材料レポート、6GHz帯の世界政策とWi-Fi 8についてのウェビナー開催、iFixitがPixel BUds 2aを分解、OnePlus15分解動画など(2025.11.17)
- RF Weekly Digest (Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2025/11/9-2025/11/16(2025.11.16)
- Visual Studio 2026がリリースされたので早速新しいPCにインストール。全面的にGitHub Copilotを使うようになっている。とりあえずC#でMath.NET numericsを使って連立方程式を計算するコードを書いてもらったら一発で動く。他の例として固有値や非線形計算もコードを出してくれた。(2025.11.14)
- 高周波・RFニュース 2025年11月13日 QorvoがTWTA置き換えの広帯域SSPA発表、iFixitがiPad Pro M5分解、KYOCERA AVXが0.9Vで動く超小型クロック発表、Mini-Circuitsが様々なBALUNやトランス解説、軍用5G解説、imecの110GHz可能な300mm GeSiウェハー(2025.11.13)
- 高周波・RFニュース 2025年11月12日 Qualcommが語る技術の標準化、STMicroelectronicsが語るシリコンフォトニクス、HuaweiがイノベーションとIPフォーラム開催、6G SummitでFCCのコミッショナーが米国が6Gをリードすべしと語る(2025.11.12)


コメント