在 MATLAB 中使用 FFT(快速傅里叶变换)计算信号的频谱时,**除以数据长度**的目的是为了确保频域幅度的物理正确性。这是因为 FFT 的默认输出是未归一化的,其幅度与输入数据的长度成正比。以下是详细解释:

---

### 1. **FFT 的数学定义**
FFT 是离散傅里叶变换(DFT)的高效算法,其数学定义为:
\[
X(k) = \sum_{n=0}^{N-1} x(n) \cdot e^{-i 2\pi kn/N}
\]
其中:
- \(x(n)\) 是时域信号(长度为 \(N\))。
- \(X(k)\) 是频域结果(复数,包含幅度和相位)。

**关键点**:FFT 的直接结果 \(X(k)\) 的幅度与输入数据长度 \(N\) 成正比。例如,若输入信号幅度为 1,但数据长度 \(N\) 增加,FFT 输出的幅度也会按比例增大。

---

### 2. **为什么需要除以 \(N\)?**
为了得到**物理真实的幅度**(与时域信号一致),需要将 FFT 结果除以 \(N\):
\[
\text{正确幅度} = \frac{|X(k)|}{N}
\]
**原因**:
- **能量守恒**:时域信号的总能量应等于频域的总能量(帕塞瓦尔定理)。除以 \(N\) 保证了能量的一致性。
- **幅度匹配**:例如,时域中一个幅值为 \(A\) 的正弦波,其频域峰值应为 \(A/2\)(单边频谱)或 \(A\)(双边频谱)。若不除以 \(N\),FFT 输出的峰值会是 \(A \cdot N/2\),显然不正确。

---

### 3. **MATLAB 中的具体操作**
- **直接 FFT 输出**:`Y = fft(y)` 的结果是未归一化的,幅度为 \(N\) 倍。
- **归一化操作**:
  - **双边频谱**(包含正负频率):`Y_normalized = Y / N`。
  - **单边频谱**(仅正频率):`Y_single_side = Y(1:N/2+1) / N * 2`(直流分量除外,它只需除以 \(N`)。

**示例**:
```matlab
Fs = 1000;            % 采样频率
T = 1/Fs;             % 采样间隔
L = 1000;             % 信号长度(N=1000)
t = (0:L-1)*T;        % 时间向量
f = 50;               % 信号频率(50 Hz)
y = 0.5 * sin(2*pi*f*t); % 幅值为0.5的正弦波

Y = fft(y);           % 计算FFT
Y_normalized = Y / L; % 归一化

% 绘制单边频谱
P2 = abs(Y_normalized);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2 * P1(2:end-1); % 乘以2(除直流和Nyquist频率)
f_axis = Fs*(0:(L/2))/L;
plot(f_axis, P1);
```
此时,频域峰值会精确显示为 **0.5**(与时域幅值一致)。

---

### 4. **特殊情况说明**
- **直流分量(零频率)**:直接除以 \(N\)。
- **Nyquist 频率(当 \(N\) 为偶数时)**:无需乘以 2(单边频谱中它是唯一的)。

---

### 5. **总结**
- **FFT 的默认输出是未归一化的**,幅度与数据长度 \(N\) 成正比。
- **除以 \(N\) 是为了保证频域幅度与时域信号的真实幅度匹配**。
- 对于单边频谱,还需对非直流分量额外乘以 2(因为能量对称分布在正负频率上)。

通过这种归一化,FFT 的频域结果才能正确反映信号的物理特性。

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐