Main Content

nufft

非均匀快速傅里叶变换

自 R2020a 起

说明

示例

Y = nufft(X,t) 使用采样点 t 返回 X非均匀离散傅里叶变换 (NUDFT)

  • 如果 X 是向量,则 nufft 返回该向量的变换。

  • 如果 X 是矩阵,则 nufftX 的各列视为向量,并返回每列的变换。

  • 如果 X 是一个多维数组,则 nufft 将沿大小不等于 1 的第一个数组维度的值视为向量,并返回每个向量的变换。

示例

Y = nufft(X,t,f) 使用采样点 t 计算查询点 f 的 NUDFT。要指定 f 而不指定采样点,请使用 nufft(X,[],f)

Y = nufft(X,t,f,dim) 返回沿维度 dim 的 NUDFT。例如,nufft(X,t,f,2) 计算矩阵 X 的每行的变换。

Y = nufft(X) 返回 X 的离散傅里叶变换,等效于 fft(X)

示例

全部折叠

创建在非均匀分布的点 t 上采样的信号 X。绘制信号。

t = [0:300 500.5:700.5];
S = 2*sin(2*pi*0.02*t) + sin(2*pi*0.1*t);
X = S + rand(size(t));
plot(t,S)

求信号的非均匀快速傅里叶变换。当您使用 nufft 而没有提供频率作为第三个参量时,nufft 将使用默认频率缩放,其中对于信号长度 n,频率采用 f(i) = (i-1)/n 形式。将变换的绝对值绘制为默认频率的函数。

Y = nufft(X,t);
n = length(t);
f = (0:n-1)/n;
plot(f,abs(Y))

创建一个由非均匀采样点组成的时间向量。为等效均匀采样数据定义约 35 秒的持续时间,采样周期 T = 50 毫秒(或采样频率 Fs = 20 Hz)。

T = 50e-3;    % Sampling period of 50 ms for equivalent uniform samples
Fs = 1/T;     % Sampling frequency of 20 Hz for equivalent uniform samples
t = [0:T:300*T 500.5*T:T/2:700.5*T];

创建一个信号 X,在非等间距点 t 处进行采样,峰值频率为 0.4 Hz 和 2 Hz。

S = 2*sin(2*pi*0.4*t) + sin(2*pi*2*t);    % Signal with peak frequencies at 0.4 Hz and 2 Hz
X = S + rand(size(t));
plot(t,S)
xlabel("t (seconds)")
ylabel("X(t)")

求信号的非均匀快速傅里叶变换。使用 nufft(而不提供频率)作为第三个参量。在本例中,对于信号长度 nnufft 使用 f(i) = (i-1)/n 形式的默认频率。对于等效均匀采样数据,非均匀离散傅里叶变换将非均匀采样点 t 和频率 f 视为采样周期为 1 秒、采样频率为 1 Hz。因此,当使用 nufft 获取具有正确缩放单位的变换时,请将缩放因子 T 包括到时间向量中。将变换的绝对值绘制为按 Fs 缩放的默认频率的函数。

Y = nufft(X,t/T);
n = length(t);
f = (0:n-1)/n*Fs;
plot(f,abs(Y))
xlabel("f (Hz)")
ylabel("abs(Y)(f)")

当使用 nufft 时,还可以指定非均匀频率向量或查询点 f 作为第三个参量,非均匀时间向量 t 作为第二个参量。此处,当使用 nufft 时,不需要重新缩放 tf。将变换的绝对值绘制为非均匀频率的函数。

f = [0:0.5:n/4 n/3+1:n-120]/n*Fs;
Y = nufft(X,t,f);
plot(f,abs(Y))
xlabel("f (Hz)")
ylabel("abs(Y)(f)")

定义和标注一系列音乐音调的频率。

C3 = 440 / (2^(21/12));
nOctaves = 3;
musicalTones = C3 * 2.^((0:(12*nOctaves-1))/12);
toneNames = ["C";"C#";"D";"D#";"E";"F";"F#";"G";"G#";"A";"A#";"B"] + string(3:(3+nOctaves-1));
toneNames = categorical(toneNames, toneNames);

定义以 Hz 为单位的音频信号采样频率,采样点为 n 个,以及包含主和弦 X 的信号。

fs = 16e3;
n = 1:16000;
X = 4*cos(2*pi*(440/fs)*n) + 2*cos(2*pi*(554.37/fs)*n) + 3*cos(2*pi*(659.2/fs)*n);

计算并绘制主和弦的频率分量。

Y = nufft(X,[],musicalTones/fs);
bar(toneNames(:),abs(Y))

输入参数

全部折叠

输入数组,指定为向量、矩阵或多维数组。

数据类型: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
复数支持:

采样点或时间向量,指定为长度为 n 的向量,其中 n 是输入数组 X 的运算维度的长度。默认情况下,样本点向量为 0:(n-1)

当使用默认采样点 0:(n-1) 时,nuffttf 视为采样周期为 1 秒、采样频率为 1 Hz 的等效均匀采样数据。因此,您可能需要重新缩放时间和频率向量,以获得具有正确缩放单位的傅里叶变换。有关示例,请参阅 具有时间和频率缩放的非均匀采样点

数据类型: double | single

查询点或频率向量,指定为向量。默认情况下,查询点向量为 (0:(n-1))/n,其中 n 是输入数组 X 的运算维度的长度。要指定 f 而不指定采样点,请使用 nufft(X,[],f)

当使用默认查询点 (0:(n-1))/n 时,nuffttf 视为采样周期为 1 秒、采样频率为 1 Hz 的等效均匀采样数据。因此,您可能需要重新缩放时间和频率向量,以获得具有正确缩放单位的傅里叶变换。有关示例,请参阅 具有时间和频率缩放的非均匀采样点

数据类型: double | single

沿其运算的维度,指定为正整数标量。默认值是其大小不等于 1 的第一个数组维度。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

详细信息

全部折叠

向量的非均匀离散傅里叶变换

对于长度为 n 的向量 X、采样点 t 和频率 f,X 的非均匀离散傅里叶变换定义为

Y(k)=j=1nX(j)e2πit(j)f(k)

其中 k = 1、2、…、m。当 t = 0、1、…、n - 1 且 f =(0、1、…、n - 1)/n(nufft 的默认值)时,该公式等效于 fft 函数使用的均匀离散傅里叶变换。

参考

[1] Potter, Samuel F., Nail A. Gumerov, and Ramani Duraiswami. “Fast Interpolation of Bandlimited Functions.” In 2017 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), 4516–20. New Orleans, LA: IEEE, 2017. https://doi.org/10.1109/ICASSP.2017.7953011.

[2] Dutt, A., and V. Rokhlin. “Fast Fourier Transforms for Nonequispaced Data.” SIAM Journal on Scientific Computing 14, no. 6 (November 1993): 1368–93. https://doi.org/10.1137/0914081.

扩展功能

版本历史记录

在 R2020a 中推出

另请参阅

|