정보통신기술(ICT)

푸리에 변환(Fourier Transform)

해머슴 2024. 10. 24. 13:08
import numpy as np
import matplotlib.pyplot as plt
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog

def perform_fourier_transform(signal_freq, sampling_rate, save_result=False, output_filename="fft_result.png"):
    # 샘플링 시간 생성
    t = np.linspace(0, 1, sampling_rate, endpoint=False)
   
    # 입력 신호 생성 (사인파)
    signal = np.sin(2 * np.pi * signal_freq * t)
   
    # 푸리에 변환 수행
    fft_result = np.fft.fft(signal)
    fft_freq = np.fft.fftfreq(len(signal), 1 / sampling_rate)
   
    # 푸리에 변환 결과의 절대값을 사용하여 크기 스펙트럼 계산
    magnitude_spectrum = np.abs(fft_result)
   
    # 그래프 표시
    plt.figure(figsize=(12, 6))

    # 원본 신호 그래프
    plt.subplot(2, 1, 1)
    plt.plot(t, signal)
    plt.title("Original Signal")
    plt.xlabel("Time (seconds)")
    plt.ylabel("Amplitude")

    # 푸리에 변환 결과 그래프
    plt.subplot(2, 1, 2)
    plt.plot(fft_freq, magnitude_spectrum)
    plt.title("Fourier Transform Result")
    plt.xlabel("Frequency (Hz)")
    plt.ylabel("Magnitude")
    plt.xlim(0, 50)  # 주파수 범위를 0~50Hz로 제한

    plt.tight_layout()
   
    # 결과를 파일로 저장할지 여부
    if save_result:
        plt.savefig(output_filename)
        print(f"결과가 {output_filename} 파일에 저장되었습니다.")
   
    plt.show()

def run_fft():
    # 사용자 입력값 가져오기
    signal_freq = float(entry_freq.get())
    sampling_rate = int(entry_sampling_rate.get())
    save_option = save_var.get()
   
    # 저장 옵션에 따른 파일 이름 설정
    if save_option:
        output_filename = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png")])
        if output_filename:
            perform_fourier_transform(signal_freq, sampling_rate, save_result=True, output_filename=output_filename)
    else:
        perform_fourier_transform(signal_freq, sampling_rate)

# GUI 설정
root = tk.Tk()
root.title("Fourier Transform GUI")
root.geometry("400x250")

# 입력값 레이블과 입력 필드
ttk.Label(root, text="Signal Frequency (Hz):").pack(pady=5)
entry_freq = ttk.Entry(root)
entry_freq.pack(pady=5)
entry_freq.insert(0, "5")  # 기본값 설정

ttk.Label(root, text="Sampling Rate (Hz):").pack(pady=5)
entry_sampling_rate = ttk.Entry(root)
entry_sampling_rate.pack(pady=5)
entry_sampling_rate.insert(0, "1000")  # 기본값 설정

# 저장 옵션 체크 버튼
save_var = tk.BooleanVar()
save_check = ttk.Checkbutton(root, text="Save Result to File", variable=save_var)
save_check.pack(pady=5)

# 실행 버튼
run_button = ttk.Button(root, text="Run Fourier Transform", command=run_fft)
run_button.pack(pady=20)

# GUI 실행
root.mainloop()