'프로그램 사용/fft, fftw'에 해당되는 글 39건

  1. 2024.08.01 pffft fft / ifft 테스트
  2. 2023.09.21 fft 결과에 N(입력 샘플 갯수)로 나누는 이유
  3. 2023.09.19 FFT RBW
  4. 2023.07.19 tek.com fft 관련 문서
  5. 2023.07.12 sfft
  6. 2023.07.04 fft window type과 진폭 보정계수
  7. 2023.07.03 fft window 함수
  8. 2023.06.15 pFFFT 사용법
  9. 2023.06.13 fft 결과의 amplitude가 0.5가 나오는 이유
  10. 2023.06.12 overlap kissfft

테스트 소스를 수정해서 10개 정도만 출력하고 그 값을 비교하는데 신기한걸 발견함

 

소스로는 non-canonical ordering / canonical ordering 이라고 되어있는데

하나는 pffft_transform+ pffft_zreorders 로 실행하고

다른 하나는 pffft_transform_ordered로 실행한다.

    // pass 0 : non canonical ordering of transform coefficients  
    if (pass == 0) {
      // test forward transform, with different input / output
      pffft_transform(s, in, tmp, 0, PFFFT_FORWARD);
      memcpy(tmp2, tmp, Nbytes);
      memcpy(tmp, in, Nbytes);
      pffft_transform(s, tmp, tmp, 0, PFFFT_FORWARD);
      for (k = 0; k < Nfloat; ++k) {
        assert(tmp2[k] == tmp[k]);
      }

      // test reordering
      pffft_zreorder(s, tmp, out, PFFFT_FORWARD);
      pffft_zreorder(s, out, tmp, PFFFT_BACKWARD);
      for (k = 0; k < Nfloat; ++k) {
        assert(tmp2[k] == tmp[k]);
      }
      pffft_zreorder(s, tmp, out, PFFFT_FORWARD);
    } else {
      // pass 1 : canonical ordering of transform coeffs.
      pffft_transform_ordered(s, in, tmp, 0, PFFFT_FORWARD);
      memcpy(tmp2, tmp, Nbytes);
      memcpy(tmp, in, Nbytes);
      pffft_transform_ordered(s, tmp, tmp, 0, PFFFT_FORWARD);
      for (k = 0; k < Nfloat; ++k) {
        assert(tmp2[k] == tmp[k]);
      }
      memcpy(out, tmp, Nbytes);
    }

 

아무튼 결과만 보면

ifft 값은 동일하게 나온다.(ordered / non-ordered)

그런데 ifft를 수행하고 나서 나온 결과가 raw와 다르다.

 

pffft 특성으로 인해 샘플 숫자로 나눠줘야 한다는데 

[링크 : https://dsp.stackexchange.com/questions/75749/how-to-use-pffft-fft-library]

 

일단은 그렇게 나누면 raw 와 ifft 값은 동일한 형상을 보이지만(좌하단/우하단) scale이 다르고

ifft한 값을 샘플 수 32000로 나누고 원본과 차이를 비교하면 또 형상이 동일하게 나온다(우상단)

 

데이터의 첫번째로 하면 오차율을 더 최소가 되지만 형상이 달라진다.(우상단) 멀까..?

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

fft 결과에 N(입력 샘플 갯수)로 나누는 이유  (0) 2023.09.21
FFT RBW  (0) 2023.09.19
tek.com fft 관련 문서  (0) 2023.07.19
sfft  (0) 2023.07.12
fft window type과 진폭 보정계수  (0) 2023.07.04
Posted by 구차니

실험적으로 나온 결과를 N으로 나눠줘서 쓰고 있었는데

퍼시발의 규칙에 의해 개별 주파수의 진폭은 N개의 샘플에 의해 영향을 받게되고

진폭을 N으로 나누어 평준화해야 한다고 하는데 솔찍히 확 와닫는 소리는 아니다 -_ㅠ

 

[링크 : https://stackoverflow.com/questions/63211851/why-divide-the-output-of-numpy-fft-by-n]

[링크 : https://stackoverflow.com/questions/4855958/normalising-fft-data-fftw]

 

+

2024.08.01

[링크 : https://dsp.stackexchange.com/questions/75749/how-to-use-pffft-fft-library]

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

pffft fft / ifft 테스트  (0) 2024.08.01
FFT RBW  (0) 2023.09.19
tek.com fft 관련 문서  (0) 2023.07.19
sfft  (0) 2023.07.12
fft window type과 진폭 보정계수  (0) 2023.07.04
Posted by 구차니

라고 하는게 맞는진 모르겠지만

500개의 데이터를 1초에 샘플링 할 경우

500개의 데이터를 넣냐

100개의 데이터를 넣냐에 따라 나오는결과가 달라지는데 이걸 어떻게 해석하냐에 대한 내용

 

input data

for ( i = 0; i < n; i++ )
{
in[i] = ( double ) sin ( 2.0f * PI * (double)(i * 10) / n);
}

500 에 10 주기 니까 500SPS일 경우 10Hz에 peak가 떠야 한다.

 

500개를 다 넣으면 10Hz 에서 peak가 뜬다.

같은 애를 x축 크기만 조정해서 출력하면 아래처럼 보인다. (오른쪽은 왼쪽의 그래프를 X축에 대해서 5배 확대한 것)

 

100개만 넣어서 돌리면, 값은 50개만 나오고(100/2+1) peak는 2에서 나온다.

같은 애를 x축 크기만 조정해서 출력하면 아래처럼 보인다. (왼쪽은 오른쪽의 그래프를 X축에 대해서 1/5배로 축소한 것)

 

 

 

상관관계로 보면

샘플링 속도는 동일하고

데이터 갯수가 1/N 만큼 줄어들면

원래 주파수로 환원하기 위해서는 *N을 해야 한다.

 

위의 경우 1/5 였으니까

주파수는 *5를 해야 정상적으로 나오고

다르게 해석하면 5Hz 의 RBW로 분석 주파수 해상도가 낮아졌다 라고 표현하면 될 듯.

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

pffft fft / ifft 테스트  (0) 2024.08.01
fft 결과에 N(입력 샘플 갯수)로 나누는 이유  (0) 2023.09.21
tek.com fft 관련 문서  (0) 2023.07.19
sfft  (0) 2023.07.12
fft window type과 진폭 보정계수  (0) 2023.07.04
Posted by 구차니

 

 

Fundamentals of Real-Time Spectrum Analysis

[링크 : https://download.tek.com/document/37W_17249_5_HR_Letter.pdf]

 

Understanding FFT Overlap Processing Fundamentals

[링크 : https://download.tek.com/document/37W_18839_1.pdf]

 

FFT 오버랩 프로세싱의 이해

[링크 : https://download.tek.com/document/37K_18839_0.pdf]

 

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

fft 결과에 N(입력 샘플 갯수)로 나누는 이유  (0) 2023.09.21
FFT RBW  (0) 2023.09.19
sfft  (0) 2023.07.12
fft window type과 진폭 보정계수  (0) 2023.07.04
fft window 함수  (0) 2023.07.03
Posted by 구차니

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

FFT RBW  (0) 2023.09.19
tek.com fft 관련 문서  (0) 2023.07.19
fft window type과 진폭 보정계수  (0) 2023.07.04
fft window 함수  (0) 2023.07.03
pFFFT 사용법  (0) 2023.06.15
Posted by 구차니

Uniform은 rectangular 인 것 같고(1이니까)

그 외에는... Energy correction은 어떻게 써먹어야 하려나?

 

 

[링크 : https://community.sw.siemens.com/s/article/window-correction-factors]

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

tek.com fft 관련 문서  (0) 2023.07.19
sfft  (0) 2023.07.12
fft window 함수  (0) 2023.07.03
pFFFT 사용법  (0) 2023.06.15
fft 결과의 amplitude가 0.5가 나오는 이유  (0) 2023.06.13
Posted by 구차니

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

sfft  (0) 2023.07.12
fft window type과 진폭 보정계수  (0) 2023.07.04
pFFFT 사용법  (0) 2023.06.15
fft 결과의 amplitude가 0.5가 나오는 이유  (0) 2023.06.13
overlap kissfft  (0) 2023.06.12
Posted by 구차니

자세한 설명이 없어서 대충 혼돈의 카오스중..

pffft_transform()이 가장 처음 접하는 함수이긴 한데 이걸로 하니 1Hz가 아니라 4Hz에 진동이 있는걸로 검출이 되서

pffft_transform_ordered()로 바꾸니 의도한 대로 분석이 되서 일단 쓰는데, 무슨 차이인진 모르겠다.

 

int n = 32000;
int nc = ( n / 2 ) + 1;

int Nfloat = n;
int Nbytes = Nfloat * sizeof(float);

float *X = pffft_aligned_malloc(Nbytes);
float *Y = pffft_aligned_malloc(Nbytes);
float *Z = pffft_aligned_malloc(Nbytes);

PFFFT_Setup *s = pffft_new_setup(n, PFFFT_REAL);

for(int i = 0; i < 8; i++)
    pffft_transform_ordered(s, X, Z, 0, PFFFT_FORWARD);
for ( i = 0; i < nc; i++ )
    printf ( "  %3d,%12f,%12f,%12f,%12f,%12f\n", i, Z[i*2], Z[i*2+1],  
        sqrt(Z[i*2] * Z[i*2] +  Z[i*2+1] * Z[i*2+1]),
        atan2(Z[i*2+1], Z[i*2]),
        atan2(Z[i*2+1], Z[i*2]) * 180 / PI
    );

pffft_aligned_free(Z);
pffft_aligned_free(Y);
pffft_aligned_free(X);
pffft_destroy_setup(s);

[링크 : https://bitbucket.org/jpommier/pffft/src/master/]

 

성능비교 테스트. pffft가  double을 미지원하는 것을 제외하면 최소 4배는 빠르게 처리한다고 보면 될 듯.

(complex는 double이 되긴 한데 real은 float만 되는 듯?)

fftw
2023-06-15 02:40:48.089
2023-06-15 02:40:48.109 --- plan 생성 20ms
2023-06-15 02:40:48.133 --- 32k 8ch 연산 23~24ms

pffft
2023-06-15 02:40:48.136
2023-06-15 02:40:48.139 --- plan 생성 3ms
2023-06-15 02:40:48.146 --- 32k 8ch 연산 6~7ms

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

fft window type과 진폭 보정계수  (0) 2023.07.04
fft window 함수  (0) 2023.07.03
fft 결과의 amplitude가 0.5가 나오는 이유  (0) 2023.06.13
overlap kissfft  (0) 2023.06.12
fft size overlap window size  (0) 2023.06.12
Posted by 구차니

이산 푸리에 변환 자체가 원래 그런거다.. 라는 의미인가?

Because the discrete Fourier transform matches the input signal with complex exponentials and a cosine is the sum of two complex exponentials divided by 2. The same is true of a sine (except it's divided by 2i)
That is where the factor of 1/2 is coming from. Since you have a real-valued signal, if you are only interested in looking at the magnitude, you can just keep the "positive" frequencies and scale them by 2.
ThemeCopy

[링크 : https://kr.mathworks.com/matlabcentral/answers/84141-why-fft-function-returns-amplitude-divided-by-2]

 

수식을 흐린눈으로 봐도.. 모르겠다.

[링크 : https://en.wikipedia.org/wiki/Discrete_Fourier_transform]

 

fftw 가 실제로 계산하는 것이라는데 수식상으로는 e^-2 밖에 눈에 안띄는데 어떤 부분이 divide by 2 부분일까?

The forward (FFTW_FORWARD) discrete Fourier transform (DFT) of a 1d complex array X of size n computes an array Y, where:


.The backward (FFTW_BACKWARD) DFT computes:.

[링크 : https://www.fftw.org/fftw3_doc/The-1d-Discrete-Fourier-Transform-_0028DFT_0029.html]

 

 

+

2023.06.16

이해를 못하고 있었는데 아래글을 읽고 아! 싶어졌다.

 

Size of FFT in 1D is not half of the signal length. It's still the signal length (assuming FFT length was of the signal length). However for real data, due to conjugate symmetryhalf of this is redundant and can be dicarded to reduce storage. Note however that, when it's required to process the FFT data, you have to construct the full length from the half and proceed.

This is also the reason why spectral analysis software display only positive frequencies for real data; i.e, negative frequencies will be a mirror copy (of the magnitude) of positive frequencies.

But you don't have to discard the half. You can just retain it.

For image processing, the symmetry of FFT for real input data again exist and if you wish you can also dicard half of the image FFT data. Whether this will be employed or not depends on the intentions of the package.

아니요.

1D에서 FFT의 크기는 신호 길이의 절반이 아닙니다. 여전히 신호 길이입니다(FFT 길이가 신호 길이라고 가정). 그러나 실제 데이터의 경우 공액 대칭으로 인해 이 중 절반이 중복되며 저장 공간을 줄이기 위해 버려질 수 있습니다. 단, FFT 데이터 처리가 필요한 경우 절반에서 전체 길이를 구성하여 진행해야 합니다.

이것이 스펙트럼 분석 소프트웨어가 실제 데이터에 대해 양의 주파수만 표시하는 이유이기도 합니다. 즉, 음수 주파수는 양수 주파수의 (크기의) 거울 사본이 될 것입니다.

그러나 절반을 버릴 필요는 없습니다. 그대로 유지하시면 됩니다.

이미지 처리의 경우 실제 입력 데이터에 대한 FFT의 대칭이 다시 존재하며 원하는 경우 이미지 FFT 데이터의 절반을 버릴 수도 있습니다. 이것이 사용될지 여부는 패키지의 의도에 따라 다릅니다.

[링크 : https://dsp.stackexchange.com/questions/55239/why-is-the-size-of-results-from-fft-half-the-size-of-the-input-while-that-is-no]

[링크 : https://brianmcfee.net/dstbook-site/content/ch06-dft-properties/Conjugate-Symmetry.html]

 

예전 mathwork 에서 double sided amplitude 라는 그래프가 있었는데

실제로 FFT 변환은 -N/2 ~ 0 ~ N/2 대역에 대해서 나오지만

부호만 다를뿐 대칭된 정보이기에 메모리가 귀하던 시절 메모리 절약을 위해 절반을 휙~ 날려 버린 듯.

그래서 FFT 변환(? DFT?)을 하면 일반적으로 0~N/2 까지의 주파수가 나오고, 그걸 대칭시켜서 써야 하는 듯.

 

[링크 : https://kr.mathworks.com/help/matlab/ref/fft.html]

 

이해가 갈 듯.. 안 갈 듯 한데

복소수 공간에서 대칭적으로 나오기 때문에 한쪽만 계산하면 다른쪽 벡터가 없어서 절반 길이만 나온다고 보면 될 것 같기도?

[링크 : https://brianmcfee.net/dstbook-site/content/ch06-dft-properties/Conjugate-Symmetry.html]

 

+

켤례 복소수 하니 먼가 단어가 익숙한 느낌 (-_-)

실수를 복소수로 바꾸는건 허수가 0인 걸로 바꾸면 되는거고

켤레 복소수는 실수는 냅두고 허수부 부호만 뒤집으면 된다고.

공액(켤레) 복소수 

[링크 : https://kwon-jjing.tistory.com/40]

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

fft window 함수  (0) 2023.07.03
pFFFT 사용법  (0) 2023.06.15
overlap kissfft  (0) 2023.06.12
fft size overlap window size  (0) 2023.06.12
fftw 라이브러리 사용 테스트  (0) 2023.06.12
Posted by 구차니

fftw에서 overlap 하는 예제는 못 찾았고

kissfft를 이용해서 (bsd-3 clause) 하는 예제도 아니고 걍.. git 발견

 

아무튼 아래와 같이 입력을 중첩하고 결과를 낸다는데

그림을 봐도 어떻게 데이터를 구성하고 합쳐내는지 감이 안온다.


overlap add
input

output


[링크 : https://github.com/fbdp1202/DSP_Overlap-Save_Overlap_Add]

'프로그램 사용 > fft, fftw' 카테고리의 다른 글

pFFFT 사용법  (0) 2023.06.15
fft 결과의 amplitude가 0.5가 나오는 이유  (0) 2023.06.13
fft size overlap window size  (0) 2023.06.12
fftw 라이브러리 사용 테스트  (0) 2023.06.12
fft 잘못 사용하고 있었나?  (0) 2023.06.02
Posted by 구차니