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()
'정보통신기술(ICT)' 카테고리의 다른 글
맵 타임랩스 소프트웨어 (0) | 2024.10.28 |
---|---|
수리 물리학: 베셀 함수(Bessel Function) (0) | 2024.10.25 |
2D 라플라스 방정식을 풀기 위한 함수 (0) | 2024.10.23 |
전자기학: 파동 방정식(Sine/Cosine 형태의 파동) (0) | 2024.10.22 |
조화진동자의 시간 진화 함수 그래프 (0) | 2024.10.21 |