PyTorchでDiscrete Fourier Transformsを理解する: torch.fft.hfftn()関数解説

2024-05-23

PyTorchにおける「Discrete Fourier Transforms」と「torch.fft.hfftn()」プログラミング解説

このチュートリアルでは、PyTorchにおける「Discrete Fourier Transforms(離散フーリエ変換)」と、その中でも特に「torch.fft.hfftn()」関数について、分かりやすく解説します。

Discrete Fourier Transforms(離散フーリエ変換)は、信号処理や画像処理などの分野で広く用いられる数学変換です。信号を周波数領域に変換することで、信号に含まれる周波数成分を分析することができます。

torch.fft.hfftn()関数とは?

PyTorchには、torch.fftモジュールにhfftn()関数と呼ばれる関数があります。この関数は、N次元離散フーリエ変換を実行するために使用されます。

torch.fft.hfftn()関数は、以下の引数を取ります。

  • input: フーリエ変換を実行する入力テンソル
  • s: 各次元における出力テンソルのサイズ(省略可能)
  • norm: 規格化フラグ(デフォルトはFalse
  • dim: フーリエ変換を実行する次元(デフォルトは最後の次元)

hfftn()関数は、N次元複素テンソルを返します。

import torch
import torch.fft

# 入力テンソルを作成
input = torch.rand(2, 3, 4)

# 3次元離散フーリエ変換を実行
output = torch.fft.hfftn(input)

# 結果を出力
print(output)

この例では、3次元テンソルinputに対して3次元離散フーリエ変換を実行し、結果をoutputテンソルに格納しています。

  • 画像処理: 画像の周波数成分を分析することで、ノイズ除去や画像シャープ化などの処理を行うことができます。
  • 通信: 信号を周波数領域に変換することで、帯域幅を効率的に利用することができます。

torch.fft.hfftn()関数は、PyTorchにおけるN次元離散フーリエ変換を実行するための便利な関数です。この関数を利用することで、信号処理や画像処理などの様々なタスクを実行することができます。



このサンプルコードでは、torch.fft.hfftn()関数を使って画像処理を行う例を紹介します。具体的には、画像のノイズ除去とシャープ化を行います。

コード

import torch
import torch.fft
import numpy as np
import matplotlib.pyplot as plt

# 画像を読み込む
image = plt.imread('image.png')
image = torch.from_numpy(image).float() / 255.0

# フーリエ変換を実行
fft = torch.fft.hfftn(image)

# ノイズ除去
# 高周波成分を減衰させる
fft[np.abs(fft) > 0.1] = 0

# 逆フーリエ変換を実行
image_denoised = torch.fft.ifftn(fft).abs()

# シャープ化
# 高周波成分を増幅させる
fft[np.abs(fft) < 0.5] *= 2

# 逆フーリエ変換を実行
image_sharpened = torch.fft.ifftn(fft).abs()

# 結果を出力
plt.subplot(1, 3, 1)
plt.imshow(image)
plt.title('Original')

plt.subplot(1, 3, 2)
plt.imshow(image_denoised)
plt.title('Denoised')

plt.subplot(1, 3, 3)
plt.imshow(image_sharpened)
plt.title('Sharpened')

plt.show()

説明

このコードは以下の処理を行っています。

  1. 画像を読み込み、テンソルに変換します。
  2. フーリエ変換を実行します。
  3. ノイズ除去処理を行います。高周波成分を減衰させることで、ノイズを除去します。
  4. 逆フーリエ変換を実行し、ノイズ除去された画像を取得します。
  5. 結果を3つのサブプロットに表示します。

補足

  • このコードはあくまで一例であり、画像の種類や目的に応じてパラメータを調整する必要があります。
  • ノイズ除去処理とシャープ化処理を組み合わせることで、より効果的な画像処理を行うことができます。

関連するサンプルコード:torch.fft.hfftn()関数を使った音声処理

概要

import torch
import torch.fft
import librosa
import soundfile as sf

# 音声を読み込む
audio, sr = librosa.load('audio.wav')
audio = torch.from_numpy(audio).float()

# 短時間フーリエ変換を実行
stft = torch.stft(audio, n_per_seg=512, hop_length=256)

# ノイズ除去
# スペクトルのマスクを作成
mask = torch.ones_like(stft)
mask[np.abs(stft) < 0.1] = 0

# マスクされたスペクトルを復元
stft_denoised = stft * mask

# 逆短時間フーリエ変換を実行
audio_denoised = torch.istft(stft_denoised, n_per_seg=512, hop_length=256)

# 結果を出力
sf.write('audio_denoised.wav', audio_denoised.numpy(), sr)
  1. 短時間フーリエ変換を実行し、音声信号を周波数時間領域に変換します。
  2. ノイズ除去処理を行います。スペクトルのマスクを作成し、ノイズ成分を減衰させます。
  3. マスクされたスペクトルを復元し、ノイズ除去された音声信号を取得します。
  4. 結果をWAVファイルに保存します。
  • このコードはあくまで一例であり、音声の種類やノイズの種類


  • 概要:1次元DFTを実行します。
  • 利点:最もシンプルな関数で、理解しやすい。
  • 欠点:高次元DFTには直接適用できない。
import torch
import torch.fft

# 入力テンソルを作成
input = torch.randn(10)

# 1次元DFTを実行
output = torch.fft.fft(input)

# 結果を出力
print(output)
  • 利点:torch.fft.fft()と組み合わせて、周波数領域と時間領域を行き来できる。
import torch
import torch.fft

# 入力テンソルを作成
input = torch.randn(10)

# 1次元DFTを実行
output = torch.fft.fft(input)

# 1次元逆DFTを実行
reconstructed_input = torch.fft.ifft(output)

# 入力と復元結果を比較
print(input)
print(reconstructed_input)
  • 欠点:torch.fft.fft()torch.fft.ifft()よりも複雑なコードになる可能性がある。
import torch
import torch.fft

# 入力テンソルを作成
input = torch.randn(2, 3, 4)

# 3次元DFTを実行
output = torch.fft.hfftn(input)

# 結果を出力
print(output)
    import torch
    import torch.fft
    
    # 入力テンソルを作成
    input = torch.randn(2, 3, 4)
    
    # 3次元DFTを実行
    output = torch.fft.hfftn(input)
    
    # 3次元逆DFTを実行
    reconstructed_input = torch.fft.ihfftn(output)
    
    # 入力と復元結果を比較
    print(input)
    print(reconstructed_input)
    
    • 利点:画像処理などによく用いられる2次元DFTを効率的に実行できる。
    import torch
    import torch.fft
    
    # 入力テンソルを作成 (2次元画像)
    input = torch.randn(256, 256)
    
    # 2次元DFTを実行
    output = torch.fft.fftn2(input)
    
    # 結果を出力
    print(output)
    
      import torch
      import torch.fft
      
      # 入力テンソルを作成 (2次元画像)
      input = torch.randn(256, 256)
      
      # 2次元DFTを実行
      output = torch.fft.fftn2(input)
      
      # 2次元逆DFTを実行
      reconstructed_input = torch.fft.ifftn2(output)
      
      # 入力と復元結果を比較
      print(input)
      print(reconstructed_input)
      

      その他

      上記以外にも、torch.fft モジュールには様々なDFT関連関数があります。 詳細については、PyTorchのドキュメントを参照してください。 https://pytorch.org/docs/stable/fft.html

      • DFTは様々な分野で応