정보통신기술(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()