# ty_fft
快速傅里叶变换
函数库: TyMath
# 语法
Y = ty_fft(X)
Y = ty_fft(X,n)
Y = ty_fft(X,n,dim)
# 说明
Y = ty_fft(X) 用快速傅里叶变换 (FFT) 算法计算 X 的离散傅里叶变换 (DFT)。示例
如果 X 是向量,则 ty_fft(X) 返回该向量的傅里叶变换;
如果 X 是矩阵,则 ty_fft(X) 将 X 的各列视为向量,并返回每列的傅里叶变换;
如果 X 是一个多维数组,则 ty_fft(X) 将沿大小不等于 1 的第一个数组维度的值视为向量,并返回每个向量的傅里叶变换。
Y = ty_fft(X,n) 返回 n 点 DFT。如果未指定任何值,则 Y 的大小与 X 相同。示例
如果 X 是向量且 X 的长度小于 n,则为 X 补上尾零以达到长度 n;
如果 X 是向量且 X 的长度大于 n,则对 X 进行截断以达到长度 n;
如果 X 是矩阵,则每列的处理与在向量情况下相同;
如果 X 为多维数组,则大小不等于 1 的第一个数组维度的处理与在向量情况下相同。
Y = ty_fft(X,n,dim) 返回沿维度 dim 的傅里叶变换。例如,如果 X 是矩阵,则 ty_fft(X,n,2) 返回每行的 n 点傅里叶变换。
# 示例
FFT 的插值
通过填充零来对信号的傅里叶变换进行插值。
指定信号的参数,采样频率为 80 Hz,信号持续时间为 0.8 秒。
using TyMath
using TyPlot
Fs = 80
T = 1/Fs
L = 65
t = (0:L-1)*T
创建一个 2 Hz 正弦信号及其高次谐波的叠加。该信号包含一个 2 Hz 余弦波、一个 4 Hz 余弦波和一个 6 Hz 正弦波。
X = @. 3*cos(2*π*2*t) + 2*cos(2*π*4*t) + sin(2*π*6*t);
在时域中绘制该信号。
plot(t,X)
title("Signal superposition in time domain")
xlabel("t (ms)")
ylabel("X(t)")
计算信号的傅里叶变换。
Y = ty_fft(X);
计算信号的单侧幅值频谱。
f = Fs*(0:(L-1)/2)/L;
P2 = abs.(Y/L);
P1 = P2[1:(L+1)÷2];
P1[2:end] = 2*P1[2:end];
在频域中绘制单侧频谱。由于信号的时间采样相当短,傅里叶变换的频率分辨率不够精确,不足以显示 4 Hz 附近的峰值频率。
plot(f,P1,"-o")
title("Single-Sided Spectrum of Original Signal")
xlabel("f (Hz)")
ylabel("|P1(f)|")
为了更好地评估峰值频率,您可以通过用零填充原始信号来增加分析窗的长度。这种方法以更精确的频率分辨率自动对信号的傅里叶变换进行插值。
从原始信号长度确定下一个 2 次幂的新输入长度。用尾随零填充信号 X 以扩展其长度。计算填零后的信号的傅里叶变换。
n = nextpow(2,L);
Y = ty_fft(X,n);
计算填零后的信号的单侧幅值频谱。由于信号长度 n 从 65 增加到 128,频率分辨率变为 Fs/n,即 0.625 Hz。
f = Fs*(0:(n/2))/n;
P2 = abs.(Y/L);
P1 = P2[1:n÷2+1];
P1[2:end-1] = 2*P1[2:end-1];
绘制填零后的信号的单侧频谱。此新频谱在 0.625 Hz 的频率分辨率内显示 2 Hz、4 Hz 和 6 Hz 附近的峰值频率。
plot(f,P1,"-o")
title("Single-Sided Spectrum of Padded Signal")
xlabel("f (Hz)")
ylabel("|P1(f)|")
# 输入参数
X - 输入数组向量 | 矩阵 | 多维数组
数据类型: Int | Float |Bool
复数支持: 是
n - 变换长度nothing(默认) | 正整数标量 | 空数组 | :
数据类型: Int
变换长度,指定为 nothing、空数组、: 或正整数标量。为变换长度指定正整数标量可以改进 ty_fft 的性能。通常,长度指定为 2 的幂或可分解为小质数的乘积的值。(质因数不大于 7)。如果 n 小于信号的长度,则 ty_fft 忽略第 n 个条目之后的其余信号值,并返回截断后的结果。
dim - 沿其运算的维度正整数标量
沿其运算的维度,指定为正整数标量。如果未指定值,则默认为第一个大于 1 的数组维度。
ty_fft(X,nothing,1) 沿 X 的第一个维度进行傅里叶变换。
数据类型: Int
# 输出参数
Y - 频域表示向量 | 矩阵 | 多维数组
数据类型: Float | Int
复数支持: 是