« 高周波・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はいきなり検索を始めた。これはどっちがいいのか。 »

2026年4月23日 (木)

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
}

実行結果

Officescriptmathfft01

次は固有値とかかな。

« 高周波・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はいきなり検索を始めた。これはどっちがいいのか。 »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 高周波・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はいきなり検索を始めた。これはどっちがいいのか。 »

最近の記事

2026年5月
          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            

最近のコメント

無料ブログはココログ
フォト