ExcelのOfficeスクリプト(TypeScript)で数値計算ライブラリmath.jsを使う(2) FFT(高速フーリエ変換)を実行する。getValues, setValuesで2次元と1次元の配列の相互変換が必要。
前回は行列演算をやってみた。今回はFFT。だいぶOfficeスクリプトのことを忘れていたが、とにかくgetValues, setValuesで2次元と1次元の配列の変換が必要なことを思い出した。しかもflat()も使えないのでmapを使うしかない。
コードはこんな感じで。
async function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getWorksheet("Sheet1")
const range = sheet.getRange("A2:B257")
const values : number [][] = range.getValues() as number[][];
// getValuesは2次元配列で受け取るので1次元化
const t : number[] = values.map(x => x[0]);
const y : number[] = values.map(x => x[1]);
// 送信するJSONデータ
const data = {
"expr": [
"z = fft(" + JSON.stringify(y) + ")",
"x = re(z)",
"y = im(z)"
],
"precision": 14
};
// APIへの送信
const response = await fetch('http://api.mathjs.org/v4/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
});
// レスポンスの処理
const result: JSONData = await response.json();
const zReal : number[]= JSON.parse(result.result[1]);
const zImag: number[] = JSON.parse(result.result[2]);
const freq : number []= fftfreq(256, 1)
// setValuesは2次元配列が必要
sheet.getRange("D2:D257").setValues(freq.map(x => [x]));
sheet.getRange("E2:E257").setValues(zReal.map(x => [x]));
sheet.getRange("F2:F257").setValues(zImag.map(x => [x]));
}
interface JSONData {
"result": string | string[] | null
"error": string | null
}
// 周波数シフト用
function fftfreq(n : number, d : number) : number[] {
let x : number[] = []
if (n % 2 === 0) {
for (let i = 0; i < n / 2; i++) {
x[i] = i * d / n
}
for (let i = n / 2; i < n; i++) {
x[i] = (i - n) * d / n
}
} else {
for (let i = 0; i < (n - 1) / 2 + 1; i++) {
x[i] = i * d / n
}
for (let i = (n - 1) / 2 + 1; i < n; i++) {
x[i] = (i - n) * d / n
}
}
return x
}
|
実行結果
次は固有値とかかな。
« 高周波・RFニュース 2026年4月23日 Qualcommへの6G周波数割り当てインタビュー動画、5Gミリ波向け基板材料・技術のレビュー論文発行、車内センシングレーダ解説、Amphenol RFの18GHzまで使えるSMAピッグテイルアセンブリ | トップページ | Qwen3.6 27Bと31B-A3Bにllama.cppでDuckDuckGoのMCPサーバーを使って検索機能を付けてみた(量子化はunslothのQ4_K_M)。とりあえず今日の大阪の天気を聞くと31B-A3Bは今日の日付を知ってから検索始めたが、27Bはいきなり検索を始めた。これはどっちがいいのか。 »
「パソコン・インターネット」カテゴリの記事
- ExcelのCopilotのPlanモードで、サザエさんじゃんけんの次回の予測をやってもらう。予測法はいろいろ挙げてもらって推奨のランダムフォレストにしてもらった。次回はチョキと予測(Codexはパーと予測)。(2026.05.21)
- Gemini 3.5 FlashとAntigravity 2.0を使って任意ポート数のTouchstoneフォーマットのSパラメータファイルを読み込み、dB, 位相, スミスチャート, TDRをプロット(ズームとマーカー機能付き)するアプリを作った。今まで使ったどの生成AIより一番出来がよくしかも爆速。(2026.05.20)
- Google AntigravityにTypeScriptでSパラメータのTouchstoneフォーマットを扱うライブラリを仕様書pdfを読んで作ってもらった。dB, 位相, スミスチャートはPlotlyを使用。これはかなり完成度高い。(2026.05.19)
- CodexにTypeScript用のS高周波パラメータのTouchstoneファイルを扱うライブラリを作ってもらう。最初何も指定しなかったらプロットをSVGでやってくれて、あとでPlotly使ってというとスミスチャートもちゃんと描けた。(2026.05.15)
「学問・資格」カテゴリの記事
- 高周波・RFニュース 2026年5月22日 6GWorldとKeysightのRFデジタルツイン解説とウェビナー、Qualcomm がDragonwing Mobile Broadband Multimedia (MBM)発表、Sony Xperia 1 VII分解動画、SiLabのSoCを使ったComminentのWi-SUNモジュールが500,000台出荷など(2026.05.22)
- 高周波・RFニュース 2026年5月21日 Analog DevicesがEmpower Semi.を買収、SamsungとGoogleが協業でスマートグラス公開、SEMCOがHi-Q 0201 MLCC, 車載Low-ESL MLCC発表、シリコンキャパシタは大口受注、大連での3GPP WG会議、(2026.05.21)
- ExcelのCopilotのPlanモードで、サザエさんじゃんけんの次回の予測をやってもらう。予測法はいろいろ挙げてもらって推奨のランダムフォレストにしてもらった。次回はチョキと予測(Codexはパーと予測)。(2026.05.21)
- Gemini 3.5 FlashとAntigravity 2.0を使って任意ポート数のTouchstoneフォーマットのSパラメータファイルを読み込み、dB, 位相, スミスチャート, TDRをプロット(ズームとマーカー機能付き)するアプリを作った。今まで使ったどの生成AIより一番出来がよくしかも爆速。(2026.05.20)
「日記・コラム・つぶやき」カテゴリの記事
- 高周波・RFニュース 2026年5月22日 6GWorldとKeysightのRFデジタルツイン解説とウェビナー、Qualcomm がDragonwing Mobile Broadband Multimedia (MBM)発表、Sony Xperia 1 VII分解動画、SiLabのSoCを使ったComminentのWi-SUNモジュールが500,000台出荷など(2026.05.22)
- 高周波・RFニュース 2026年5月21日 Analog DevicesがEmpower Semi.を買収、SamsungとGoogleが協業でスマートグラス公開、SEMCOがHi-Q 0201 MLCC, 車載Low-ESL MLCC発表、シリコンキャパシタは大口受注、大連での3GPP WG会議、(2026.05.21)
- ExcelのCopilotのPlanモードで、サザエさんじゃんけんの次回の予測をやってもらう。予測法はいろいろ挙げてもらって推奨のランダムフォレストにしてもらった。次回はチョキと予測(Codexはパーと予測)。(2026.05.21)
- Gemini 3.5 FlashとAntigravity 2.0を使って任意ポート数のTouchstoneフォーマットのSパラメータファイルを読み込み、dB, 位相, スミスチャート, TDRをプロット(ズームとマーカー機能付き)するアプリを作った。今まで使ったどの生成AIより一番出来がよくしかも爆速。(2026.05.20)
« 高周波・RFニュース 2026年4月23日 Qualcommへの6G周波数割り当てインタビュー動画、5Gミリ波向け基板材料・技術のレビュー論文発行、車内センシングレーダ解説、Amphenol RFの18GHzまで使えるSMAピッグテイルアセンブリ | トップページ | Qwen3.6 27Bと31B-A3Bにllama.cppでDuckDuckGoのMCPサーバーを使って検索機能を付けてみた(量子化はunslothのQ4_K_M)。とりあえず今日の大阪の天気を聞くと31B-A3Bは今日の日付を知ってから検索始めたが、27Bはいきなり検索を始めた。これはどっちがいいのか。 »



コメント