java - 了解 Jtransform 和 ColumbiaFFT 的 FFT 输出
问题描述
当我应用 Jtransform 的 FFT 时,我得到了一个我不明白的结果。
我得到的输出频率与我预期的不同。
目前我尝试使用 Jtransform。从这个库中,我使用了realForward(double[] a)
.
为了测试应用程序,我使用了以下参数:
- 输入频率 = 50 赫兹
- 采样率 = 1 Khz
- 信号长度 = 1024
下面是我写的测试方法的代码片段:
private static void test() {
//double[] signal = {980, 988, 1160, 1080, 928, 1068, 1156, 1152, 1176, 1264};
int signalLength = 1024;
double[] signal = new double[signalLength];
double sampleRate = 1000;
// Generate sin signal f = 50 , SampleRate = 0,001
for (int i = 0; i < signal.length; i++) {
signal[i] = Math.sin(2 * Math.PI * i * 50.0 / sampleRate);
}
// Copy signal for columbiaFFT
double signal2[] = signal.clone();
// Calculate FFT using Jtransforms
DoubleFFT_1D fft_1D = new DoubleFFT_1D(signal.length);
fft_1D.realForward(signal);
double[] magResult = new double[signal.length / 2];
double re, im;
magResult[0] = signal[0];
for (int i = 1; i < magResult.length - 1; i++) {
re = signal[i * 2];
im = signal[i * 2 + 1];
magResult[i] = Math.sqrt(re * re + im * im);
}
// converting bin to frequency values
double[] bin2freq = new double[magResult.length];
// sampleRate is in Hz
for (int i = 0; i < bin2freq.length; i++) {
bin2freq[i] = i * sampleRate / magResult.length;
//bin2freq[i] = i * sampleRate / * signal.length;
}
System.out.println("freq 1 " + bin2freq[1]);
// Calculate FFT using columbiaFFT
FFTColumbia fftColumbia = new FFTColumbia(signalLength);
double[] imaginary = new double[signal2.length];
fftColumbia.fft(signal2, imaginary);
double[] magColumbia = new double[signal2.length];
for (int i = 0; i < magColumbia.length; i++) {
magColumbia[i] = Math.sqrt(Math.pow(signal2[i], 2) + Math.pow(imaginary[i], 2));
}
}
当我绘制信号的幅度时,除了看到噪声和幅度的负结果(我认为它可能来自不应用窗口),我通过应用 Jtransform 的 fft 获得了一个意想不到的 f 图(图像在这里)。
我还想问一下FFT Columbia 算法是否直接显示频率和幅度,或者它是否也显示 bin,因此我必须将其转换为 F。
请参阅绘制 FFT Columbia 与 Jtransform
蓝色信号为 FFT Columbia 输出 红色信号为 FFT Jtransform 输出
如果是这种情况,我可能会生成错误的信号。
解决方案
推荐阅读
- python - 如何在 python 中获得 Durbin Watson 测试的 p 值?
- dialogflow-es - 在 Dialogflow 中将参数添加到没有 webhook 的上下文
- python - 在 Python 中将一个 HAR 文件的前 N 行复制到另一个文件
- html - jQuery:我如何重置倒数计时器?
- sas - 使用 PROC FORMAT 和 PROC FCMP 转换 SAS 中的值
- python - Pip 无法安装库,我不知道为什么(chatterbot)
- php - 如何解决尝试访问 null 类型值的数组偏移量错误?
- python - 客户端推送内联键盘按钮后如何调用函数?
- json - Go:读取 JSON 文件与读取 JSON 字符串
- maven - Maven 在 Jenkins 上构建 - 上游版本范围解析为在并发作业中构建的版本