FFT解释

发布于 2024-12-25 03:15:27 字数 1211 浏览 0 评论 0原文

我正在开发一个 Android 项目,其中使用 FFT 来处理加速度计数据,但我在理解这些东西实际工作原理时遇到了问题。 我按以下方式使用 Piotr Wendykier 的 jTransform 库:

        int length = vectors.length;
        float[] input = new float[length*2];
        for(int i=0;i<length;i++){
            input[i]=vectors[i];
        }

        FloatFFT_1D fftlib = new FloatFFT_1D(length);
        fftlib.complexForward(input);

        float outputData[] = new float[(input.length+1)/2];
        if(input.length%2==0){
            for(int i = 0; i < length/2; i++){

                outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*(i)+1], 2)));
            }
        }else{
            for(int i = 0; i < length/2+1; i++){

                outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*i+1], 2)));
            }
        }

        List<Float> output = new ArrayList<Float>();
        for (float f : outputData) {
            output.add(f);
        }

结果是一个包含以下数据的数组 output data Visualization

我在解释输出数据时遇到问题。数据来自 10 秒长的间隔,采样频率为 50Hz。捕获时,我在手中每 3/4 秒上下移动手机 cca,所以是可能的x 值 16 附近的极值可能是信号最强分量的周期? 我需要获得信号中最强分量的频率。

I am wokring on an Android project where I am using FFT for processing accelerometer data and I have problems understanding how are these things actually working.
I am using jTransform library by Piotr Wendykier in the following way:

        int length = vectors.length;
        float[] input = new float[length*2];
        for(int i=0;i<length;i++){
            input[i]=vectors[i];
        }

        FloatFFT_1D fftlib = new FloatFFT_1D(length);
        fftlib.complexForward(input);

        float outputData[] = new float[(input.length+1)/2];
        if(input.length%2==0){
            for(int i = 0; i < length/2; i++){

                outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*(i)+1], 2)));
            }
        }else{
            for(int i = 0; i < length/2+1; i++){

                outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*i+1], 2)));
            }
        }

        List<Float> output = new ArrayList<Float>();
        for (float f : outputData) {
            output.add(f);
        }

the result is an array with following data output data visualization.

I have problem with interpreting the output data..The data are from 10 seconds long interval, and the sampling frequency is 50Hz..While capturing I was moving the phone up and down cca each 3/4 second in my hand, so is possible that the extreme which is about x value 16 could be the period of the strongest component of the signal?
I need to obtain the frequency of the strongest component in the signal..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你的笑 2025-01-01 03:15:27

每个 fft 结果 bin 表示的频率是 bin 编号乘以采样率除以 fft 的长度(与 Sinc 函数卷积,使其具有非零宽度,以获得一点技术性)。如果您的采样率为 50 Hz,并且 fft 的长度为 fft 长度为 512,则 fft 结果的 bin 16 将表示大约 1.6 Hz,其周期接近 0.7 秒。

bin 0 (DC) 处的尖峰可能代表加速度计上的非零重力。

The frequency represented by each fft result bin is the bin number times the sample rate divided by the length of the fft (convolved with a Sinc function giving it non-zero width, to get a bit technical). If your sample rate is 50 Hz and your fft's lenght is fft length is 512, then bin 16 of the fft result would represent about 1.6 Hz which is close to having a period of 0.7 seconds.

The spike at bin 0 (DC) might represent the non-zero force of gravity on the accelerometer.

平生欢 2025-01-01 03:15:27

由于您拥有真实数据,因此您应该将这些值传递给 realForward 函数(而不是 complexForward),如所述 此处

Since you have the real data, you should pass these values to realForward function (not complexForward) as stated here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文