簡體   English   中英

DSP Java FFt Jtransform

[英]DSP Java FFt Jtransform

在我的項目中,我有一個帶有EEG探針的文件(16338探針,256 Hz采樣率)。 看起來像這樣:

探測文件

在我的程序中,我需要從時域切換到頻域。 我正在使用Jtransform lib來做到這一點,但我一直堅持下去。 我已經用double數組中的探針加載了列,並從Jtransform lib中進行了double復數FFT。 代碼如下:

int N= chanel.length;
int Fs=256;
double re;
double im;
double fft[]=new double[N*2];
double[] magnitude = new double[N/2];

//System.arraycopy(chanel,0,fft,0,chanel.length);

for (int i=0; i<N-1; i++)
{
  fft[2*i]=chanel[i];
  fft[2*i+1]=0;
}

DoubleFFT_1D fftDo =new DoubleFFT_1D(N);
fftDo.complexForward(fft);

for(int i=0;i<N/2-1;i++)
{
  re=fft[2*i];
  im=fft[2*i+1];

  magnitude[i]=Math.sqrt(re*re+im*im);
}

double max_magnitude =-999999999;
int max_index = -1;
for (int i=0; i<N/2-1;i++)
{
  if (magnitude[i]>max_magnitude)
  {
    max_magnitude=magnitude[i];
    max_index=i;
  }
}

double dominantFreq =  max_index*Fs/N;

這些是該代碼不同部分的輸出:

產出

我讀了很多關於DSP的文章,試圖從教授那里獲得一些建議,但是他只給了我一些我不太了解的數學公式。 我需要繪制頻域圖,但我仍然不知道如何從該點獲得這些頻率(我知道這很愚蠢,因為它離解決方案太近了,但是在閱讀了有關DSP的一周后,我無法弄清楚)。 所以我的問題是:

有人可以嘗試以我最簡單的方式解釋它還是以偽代碼或某些示例顯示?

因此,您從256Hz采樣數據開始,您有16388個bin,結果應為每個bin 0.015621186 Hz的步長。 您可以將幅度相對於頻率的圖表繪制出來,隨行隨進,每個倉位可增加0.01562 Hz,最高可達128 Hz(采樣率/ 2)。 一種方法是將幅度數據放入Excel,然后將單元格數乘以0.01562以得到頻率,然后全部選擇並創建圖形。

在這里,我修改了您的一個循環以輸出頻率。

double step = Fs/N; // 0.015621186;
double freq = 0;
double freqs[] = double[N/2];
for(int i=0;i<N/2-1;i++)
{
    re=fft[2*i];
    im=fft[2*i+1];

    magnitude[i]=Math.sqrt(re*re+im*im);
    freqs[i] = freq;

    freq = freq + step;
}

否則,您可以使用Java圖形庫。

從概念上講,這些數量級中的每個數量級都是倉中所有正弦波在加在一起的頻率范圍之間的大小。

總而言之,您擁有數據,只需要對其作圖即可。 您還可以顯示在圖表上找到的“主頻”,以查看其外觀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM