一个 的信号,降采样后的信号会在新采样率 的整数倍附近出现镜像。混叠后的频率 为:
其中 是使得 落在 (奈奎斯特带宽)范围内的整数。
此代码实现了时域信号生成、物理振幅归一化(Amplitude Normalization)、双边带零中心化以及单边带转换。

ClearAll["Gloabl`*"]
PlotSignalFFTWithPhase[amp_, fin_, fs_, numPoints_, phase_] :=
Module[{data, fftRaw, dsbMagnitudes, ssbMagnitudes, dsbFreqs,
ssbFreqs, nHalf},
(*1. 生成带相位的离散采样信号*)(*x[n]=A*Sin(2*Pi*fin*n/fs+phase)*)
data =
Table[amp*Sin[2 Pi fin*(n/fs) + phase], {n, 0, numPoints - 1}];
(*2. 执行 FFT 并归一化*)
fftRaw = Fourier[data, FourierParameters -> {1, -1}]/numPoints;
(*3. 处理双边带 (0 对称)*)
dsbMagnitudes = RotateRight[Abs[fftRaw], Floor[numPoints/2]];
dsbFreqs =
Table[f, {f, -Floor[numPoints/2], Ceiling[numPoints/2] - 1}]*(fs/
numPoints);
(*4. 处理单边带*)
nHalf = Floor[numPoints/2] + 1;
ssbMagnitudes = Abs[fftRaw[[1 ;; nHalf]]];
ssbMagnitudes[[2 ;; nHalf - 1]] *= 2;
ssbFreqs = Table[f, {f, 0, nHalf - 1}]*(fs/numPoints);
Column[{
(*原信号时域图:观察初始位置的偏移*)
ListLinePlot[data[[1 ;; Min[numPoints, 100]]],
PlotLabel ->
"Time Domain (Phase = " <> ToString[phase] <> " rad)",
Frame -> True, Filling -> Axis, PlotRange -> All,
ImageSize -> Medium],(*双边带幅值谱:相位不改变 Abs 谱*)
ListLinePlot[Transpose[{dsbFreqs, dsbMagnitudes}],
PlotLabel -> "Double-Sided Amplitude Spectrum", Frame -> True,
FrameLabel -> {"Frequency (Hz)", "Amplitude (V)"},
PlotRange -> { {-fs/2, fs/2}, {0, amp*0.6} }, Filling -> Axis,
ImageSize -> Medium],
(*单边带幅值谱*)
ListLinePlot[Transpose[{ssbFreqs, ssbMagnitudes}],
PlotLabel -> "Single-Sided Amplitude Spectrum", Frame -> True,
FrameLabel -> {"Frequency (Hz)", "Amplitude (V)"},
PlotRange -> { {0, fs/2}, {0, amp*1.1} }, Filling -> Axis,
PlotStyle -> Red, ImageSize -> Medium]
}]]
(*测试参数:amp=2,fin=5049Hz,fs=50Hz,numPoints=1000, phase=2*Pi/3*)
PlotSignalFFTWithPhase[2, 5049, 50, 1000, 2*Pi/3]
Mathematica 在进行 傅里叶变换与逆变换的时候,需要配置 FourierParameters,具有以下不同的涵义,作为电子信息类的工科,我们按照 FourierParameters -> {1,-1} 来配置就可以。
| 分类 | {a, b} | 归一化系数 | 指数符号 | 典型应用 |
|---|---|---|---|---|
| 信号处理 | {1, -1} | 负 () | MATLAB, Python (NumPy), ADC测试 | |
| 数学默认 | {0, 1} | 正 () | Mathematica 默认设置 | |
| 物理习惯 | {-1, 1} | 正 () | 物理波包分析 | |
| 解析频率 | {0, -1} | 负 () | 常见的教科书定义 |
在进行逆变换的时候,也需要配置一致的 FourierParameters -> {1,-1},Mathematica 内部会自动处理复共轭与还原系数。
| 变换类型 | 函数与参数 | 背后对应的数学物理含义 |
|---|---|---|
| 正变换 (FFT) | Fourier[data, FourierParameters -> {1, -1}] |
提取频率分量,指数使用 |
| 物理归一化 | 手动除以 | 将求和值转化为真实的物理幅值 |
| 逆变换 (IFFT) | InverseFourier[fftData, FourierParameters -> {1, -1}] |
将频率还原为时间,内部自动处理 |
| 还原归一化 | 无需手动处理 | Mathematica 的逆变换会自动处理倍数关系 |