%% =========================================================
% FFT演示
%
% 教学目标：
% 1. 理解 FFT 的物理意义
% 2. 时域 vs 频域 对比
% 3. 不同信号对应不同频谱
% =========================================================

clear; clc; close all;

% =========================
% 参数设置
% =========================
L = 1;                 % 区间长度
N = 512;               % 采样点数（越大越平滑）
x = linspace(0, L, N);

dx = x(2) - x(1);

% =========================
% 选择信号类型
% =========================
caseID = 5;

switch caseID
    
    case 1
        % 单一低频
        u = sin(2*pi*2*x);
        title_str = '单一低频 k=2';
        
    case 2
        % 单一高频
        u = sin(2*pi*10*x);
        title_str = '单一高频 k=10';
        
    case 3
        % 多频叠加
        u = sin(2*pi*2*x) + 0.5*sin(2*pi*5*x);
        title_str = '多频叠加 (k=2,5)';
        
    case 4
        % 更复杂信号
        u = sin(2*pi*2*x) + 0.5*sin(2*pi*5*x) + 0.3*sin(2*pi*15*x);
        title_str = '多频叠加 (k=2,5,15)';
        
    case 5
        % 方波（非光滑）
        u = sign(sin(2*pi*3*x));
        title_str = '方波（含高频成分）';
        
end

% =========================
% FFT计算
% =========================
U = fft(u);

% 归一化（非常重要，教学必须讲）
U = abs(U)/N;

% 频率（波数）
k = (0:N-1);

% =========================
% 只取前一半（对称性）
% =========================
half = 1:N/2;

k_half = k(half);
U_half = U(half);

% =========================
% 作图
% =========================
figure('Color','w','Position',[100 100 1200 500]);

% -------- 时域 --------
subplot(1,2,1)
plot(x, u, 'LineWidth',2);
xlabel('x');
ylabel('u(x)');
title(['时域信号：', title_str]);
grid on;

% -------- 频域 --------
subplot(1,2,2)
stem(k_half, U_half, 'filled');
xlabel('波数 k');
ylabel('|U_k|');
title('FFT频谱');
grid on;
