DFT / FFT 계산의 출력을 이해하는 데 도움이 필요합니다.
저는 숙련 된 소프트웨어 엔지니어이며 주요 주파수 찾기와 같은 일부 스마트 폰 가속도계 판독 값을 해석해야합니다. 불행히도, 저는 15 년 전에 대부분의 대학 EE 수업을 잤지 만 지난 며칠 동안 DFT와 FFT를 읽고있었습니다.
“EE 수업을 들어라”라는 응답은 없습니다. 고용주가 저에게 돈을 지불하면 실제로 그렇게 할 계획입니다. 🙂
그래서 여기 내 문제가 있습니다.
32Hz에서 신호를 캡처했습니다. 다음은 Excel에서 차트로 작성한 32 점의 1 초 샘플입니다.
그런 다음 Columbia University에서 Java로 작성된 일부 FFT 코드 를 얻었습니다 ( ” Reliable and fast FFT in Java ” 에 대한 게시물의 제안 사항을 따름 ).
이 프로그램의 출력은 다음과 같습니다. 나는 그것이 내부 FFT를 실행하고 있다고 믿기 때문에 입력과 출력 모두에 동일한 버퍼를 재사용합니다.
Before:
Re: [0.887 1.645 2.005 1.069 1.069 0.69 1.046 1.847 0.808 0.617 0.792 1.384 1.782 0.925 0.751 0.858 0.915 1.006 0.985 0.97 1.075 1.183 1.408 1.575 1.556 1.282 1.06 1.061 1.283 1.701 1.101 0.702 ]
Im: [0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ]
After:
Re: [37.054 1.774 -1.075 1.451 -0.653 -0.253 -1.686 -3.602 0.226 0.374 -0.194 -0.312 -1.432 0.429 0.709 -0.085 0.0090 -0.085 0.709 0.429 -1.432 -0.312 -0.194 0.374 0.226 -3.602 -1.686 -0.253 -0.653 1.451 -1.075 1.774 ]
Im: [0.0 1.474 -0.238 -2.026 -0.22 -0.24 -5.009 -1.398 0.416 -1.251 -0.708 -0.713 0.851 1.882 0.379 0.021 0.0 -0.021 -0.379 -1.882 -0.851 0.713 0.708 1.251 -0.416 1.398 5.009 0.24 0.22 2.026 0.238 -1.474 ]
따라서이 시점에서는 출력의 앞면이나 뒷면을 만들 수 없습니다. 나는 실수 부분이 성분 코사인 파의 진폭이고 허수 부분이 성분 사인파의 진폭 인 DFT 개념을 이해합니다. 또한 ” 디지털 신호 처리에 대한 과학자 및 엔지니어 가이드 “에서이 다이어그램을 따를 수도 있습니다 .
그래서 내 구체적인 질문은 다음과 같습니다.
-
FFT의 출력에서 ”가장 많이 발생하는 주파수”를 어떻게 찾을 수 있습니까? 이것은 내 가속도계 데이터 분석의 일부입니다. 실수 (코사인) 또는 가상 (사인) 배열을 읽어야합니까?
-
시간 영역에 32 점 입력이 있습니다. FFT의 출력은 실수의 경우 16 개 요소 배열이고 가상의 경우 16 개 요소 배열이어야하지 않습니까? 프로그램이 크기 32의 실제 및 가상 배열 출력을 제공하는 이유는 무엇입니까?
-
이전 질문과 관련하여 출력 배열의 인덱스를 어떻게 구문 분석합니까? 32Hz로 샘플링 된 32 개 샘플의 입력을 감안할 때, 16 요소 배열 출력은 샘플링 속도 (32Hz)의 1/2까지 인덱스가 균일하게 분산되어야한다는 것을 이해하고 있으므로 각 요소를 이해하는 것이 맞습니까? 배열의 (32Hz * 1/2) / 16 = 1Hz?
-
FFT 출력에 음수 값이있는 이유는 무엇입니까? 값이 정현파의 진폭을 나타내는 것으로 생각했습니다. 예를 들어, Real [3] = -1.075의 출력은 주파수 3의 코사인 파에 대해 -1.075의 진폭을 의미해야합니다. 맞습니까? 진폭이 어떻게 음수 일 수 있습니까?
답변
-
복소수의 실수 또는 가상 부분을 찾아서는 안됩니다 (실수 및 가상 배열이 무엇인지). 대신 sqrt (real * real + imag * imag)로 정의 된 주파수의 크기를 찾고 싶습니다. 이 숫자는 항상 양수입니다. 이제 검색해야하는 모든 것은 최대 값입니다 (어레이의 첫 번째 항목은 무시합니다. DC 오프셋이며 주파수에 따른 정보를 전달하지 않음).
-
복잡한 FFT에서 복잡한 FFT를 사용하기 때문에 32 개의 실수 및 32 개의 가상 출력을 얻습니다. 허수 부 0 개로 확장하여 32 개의 샘플을 64 개의 값 (또는 32 개의 복잡한 값)으로 변환했습니다. 그 결과 주파수 결과가 두 번 발생하는 대칭 FFT 출력이 생성됩니다. 출력 0 ~ N / 2에서 사용할 준비가되고 출력 N / 2 ~ N에 미러링됩니다. 귀하의 경우 출력 N / 2 ~ N을 무시하는 것이 가장 쉽습니다. 필요하지 않습니다. FFT를 계산하는 방법에 대한 아티팩트입니다.
-
fft-bin 방정식에 대한 주파수는 (bin_id * freq / 2) / (N / 2)이며 여기서 freq는 샘플 주파수 (일명 32Hz, N은 FFT의 크기)입니다. 귀하의 경우 이것은 빈당 1Hz로 단순화됩니다. 빈 N / 2에서 N은 음의 주파수를 나타냅니다 (이상한 개념, 알고 있습니다). 귀하의 경우에는 처음 N / 2 주파수의 거울이기 때문에 중요한 정보를 포함하지 않습니다.
-
각 빈의 실수 부와 허수 부는 복소수를 형성합니다. 실수와 허수 부분이 음수이고 주파수 자체의 크기가 양수이면 괜찮습니다 (질문 1에 대한 답변 참조). 나는 당신이 복소수를 읽는 것이 좋습니다. 작동 방식 (및 유용한 이유)을 설명하는 것은 단일 스택 오버플로 질문에서 설명 할 수있는 것보다 많습니다.
참고 : 자기 상관이 무엇인지, 그리고 신호의 기본 주파수를 찾는 데 사용되는 방법을 읽을 수도 있습니다. 이것이 당신이 정말로 원하는 것이라고 생각합니다.
답변
답변
1) 첫 번째 값 (DC 구성 요소) 외에 가장 높은 값을 가진 실제 배열에서 인덱스를 찾습니다. 의미있는 결과를 많이 얻으려면 32Hz보다 상당히 높은 샘플 속도와 더 큰 창 크기가 필요할 것입니다.
2) 두 어레이의 후반부는 전반부의 미러입니다. 예를 들어, 실제 배열의 마지막 요소 (1.774)는 두 번째 요소 (1.774)와 동일하고 가상 배열의 마지막 요소 (1.474)는 두 번째 요소 의 음수 입니다.
3) 32Hz의 샘플링 속도에서 선택할 수있는 최대 주파수는 16Hz ( 나이 퀴 스트 제한 )이므로 각 단계는 2Hz입니다. 앞서 언급했듯이 첫 번째 요소는 0Hz (즉, DC 오프셋)임을 기억하십시오.
4) 물론 음의 진폭은 완벽합니다. 이는 신호가 “플립”된다는 것을 의미합니다. 표준 FFT는 일반적으로 t = 0에서 값 = 1 인 코사인을 기반으로하므로 시간 = 0에서 값 = -1 인 신호는 음의 진폭을 갖습니다. .
답변
“가장 많이 발생하는 주파수”는 윈도우 기능을 사용하더라도 여러 FFT 빈으로 산산조각이 날 수 있습니다. 따라서 스펙트럼 피크의 주파수를 더 잘 추정하기 위해 더 긴 창, 다중 창 또는 보간을 사용해야 할 수 있습니다.