gpt4 book ai didi

java - 与 MATLAB 相比,JTransforms FFT 中的大小

转载 作者:行者123 更新时间:2023-11-30 07:28:00 26 4
gpt4 key购买 nike

我目前正在使用 JTransforms 库来计算 FS 为 44100 Hz 的一秒信号的 DFT。代码非常简单:

DoubleFFT_1D fft = new DoubleFFT_1D(SIZE);
fft.complexForward(signal); // signal: 44100 length array with audio bytes.

有关 JTransform 的 DoubleFFT_1D 类的文档,请参阅此页面。 http://incanter.org/docs/parallelcolt/api/edu/emory/mathcs/jtransforms/fft/DoubleFFT_1D.html

问题是:SIZE 应该是多少?我知道这可能是窗口大小,但似乎无法让它与我遇到的最常见的值一起使用,例如 1024 和 2048。

目前我正在通过生成 1kHz 正弦信号来测试此功能。但是,当我使用上面的代码并将结果与​​ MATLAB 的 fft 函数进行比较时,它们似乎完全不同。例如。 MATLAB 给出的结果如 0.0004 - 0.0922i,而上述代码的结果如 -1.7785E-11 + 6.8533E-11i,SIZE 设置为 2048。然而,信号数组的内容是相等的。

SIZE 的哪个值会给出与 MATLAB 的内置 fft 类似的 FFT 函数?

最佳答案

根据文档,SIZE 看起来应该是 signal 中的样本数。如果它确实是 44.1 kHz 的 1 秒信号,那么您应该使用 SIZE = 44100。由于您使用的是复杂数据,因此 signal 应该是这个大小的两倍的数组(按顺序排列实数/虚数)。

如果您不使用 SIZE = 44100,您的结果将与 Matlab 给您的结果不匹配。这是因为 Matlab(可能还有 JTransforms)根据输入的长度缩放 fftifft 函数的方式——不用担心振幅不会匹配。默认情况下,Matlab 使用完整信号计算 FFT。您可以为 fft(在 Matlab 中)提供第二个参数来计算 N 点 FFT,它应该与您的 JTransforms 结果相匹配。


从您的评论来看,您似乎正在尝试创建一个 spectrogram .为此,您必须在以下各项之间权衡取舍:光谱分辨率、时间分辨率和计算时间。这是我的 1 秒频谱图的 (Matlab) 代码,针对 1 秒信号的每个 512 个样本 block 进行计算。

fs = 44100; % Hz
w = 1; % s

t = linspace(0, w, w*fs);
k = linspace(-fs/2, fs/2, w*fs);

% simulate the signal - time-dependent frequency
f = 10000*t; % Hz
x = cos(2*pi*f.*t);

m = 512; % SIZE
S = zeros(m, floor(w*fs/m));
for i = 0:(w*fs/m)-1
s = x((i*m+1):((i+1)*m));
S(:,i+1) = fftshift(fft(s));
end

Spectrogram created with 512-sample chunks
对于此图像,我们沿频率轴(y 轴)有 512 个样本,范围从 [-22050 Hz 到 22050 Hz]。沿时间轴(x 轴)有 86 个样本,覆盖约 1 秒。 Spectrogram created with 4096-sample chunks
对于这张图片,我们现在沿着频率轴(y 轴)有 4096 个样本,范围从 [-22050 Hz 到 22050 Hz]。时间轴(x 轴)再次覆盖约 1 秒,但这次只有 10 个 block 。

具有快速时间分辨率(512 个样本 block )还是高光谱分辨率(4096 个样本 block )更重要取决于您使用的信号类型。您必须决定您在时间/光谱分辨率方面想要什么,以及您可以在合理的计算时间内实现什么。例如,如果您使用 SIZE = 4096,您将能够计算出约 10x/s 的频谱(基于您的采样率),但 FFT 的速度可能跟不上。如果您使用 SIZE = 512,您的频谱分辨率会较差,但 FFT 计算速度会快得多,您可以计算 ~86x/s 的频谱。如果 FFT 仍然不够快,您可以开始跳过 block (例如,使用 SIZE=512 但只计算每隔一个 block ,每 1s 信号给出约 43 个频谱)。希望这是有道理的。

关于java - 与 MATLAB 相比,JTransforms FFT 中的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9368129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com