신호 처리를 위한 푸리에 변환의 실제 적용. ARM7 마이크로컨트롤러의 디지털 신호 처리 푸리에 변환 avr

푸리에의 정리는 모든 신호가 주기 신호 주파수의 배수인 주파수를 갖는 정규 직교 주기 함수 집합(예: 사인 및 코사인)의 계열로 확장될 수 있음을 나타냅니다. 따라서 신호의 스펙트럼 분석은 가중 계수(일반적으로 복잡한 계수) 검색을 기반으로 하며, 그 모듈은 모든 고조파의 일반적인 중첩에 도입된 해당 고조파의 발진 전력의 비율에 해당합니다. .

고속 푸리에 변환

고속 푸리에 변환(Fast Fourier Transform)은 삼각 함수의 주기성 특성을 성공적으로 활용하여 이산 푸리에 변환(DFT)에서 불필요한 계산을 방지함으로써 푸리에 전개에서 계수를 더 빠르게 찾는 계산 알고리즘입니다. 이산 변환과의 주요 차이점은 수치를 계산하는 방법(알고리즘)에만 있으며 신호 처리 자체에는 없습니다. FFT의 경우와 DFT의 경우 모두 계산 결과는 동일합니다. FFT 알고리즘의 유일한 요구 사항은 N = 2L의 배수인 샘플 크기입니다. 여기서 L은 양의 정수입니다. 가장 일반적인 기본 2 FFT 알고리즘은 시간 소멸 및 주파수 소멸입니다.

이 연구에서는 Time Thinning(Cooley-Tukey 알고리즘)을 사용하는 radix-2 FFT 알고리즘이 구현되었습니다. DFT 법칙을 공부하면 쉽게 얻을 수 있습니다. 소위 회전 계수를 소개하겠습니다.

이 경우 DFT에서는 여러 신호값(f0,f1,…,fN-1)에 대한 푸리에 계수는 다음 관계식으로 표현됩니다.

4개 값(f0,f1,f2,f3)으로 구성된 신호 계열을 생각해 보세요. 푸리에 변환을 행렬 형식으로 표현하겠습니다(정규화 계수 1/N은 표현식 오른쪽의 열 벡터 Cij에 포함됩니다).

오일러 공식을 사용하여 회전 계수를 작성하고 k = 0, 1, 2,..9에 대한 값을 결정하면 반복 계수의 패턴을 볼 수 있는 다이어그램(그림 2)을 구성할 수 있습니다.

그림 2. N=4에 대한 멱급수 w

(4)에 숫자 값을 대입하면 다음과 같은 결과를 얻습니다.

즉, w4부터 시작하는 w의 값은 w0부터 w3까지의 해당 값과 같습니다. 다음으로 행렬 방정식 (4)를 비표준 형식으로 다시 작성합니다(추가 작업의 명확성을 위해 유사한 표기법이 도입됨).

행렬의 열을 바꿔서 짝수 f0, f2 및 홀수 f1, f3 인덱스로 두 그룹으로 나누어 보겠습니다.

wk+1 = wkw1을 고려하면 식 (6)은 다음과 같이 다시 작성됩니다.

비율 사용:

셀 값이 포함된 열 벡터 형태로 필요한 확장 계수를 얻습니다.

알고리즘의 그래픽 표현(그림 3)은 날개가 열린 나비처럼 보입니다. 이것이 바로 이 계산 방법을 "나비"라고 부르는 이유입니다.

그림 3. 일련의 4개 항에 대한 나비 그래프

따라서 알고리즘의 첫 번째 단계에서는 여러 신호 값의 구성원을 짝수 인덱스와 홀수 인덱스로 나눕니다. 그런 다음 "나비" 그래프가 실행됩니다. 이는 두 단계로 구성되며 그 수는 표본 크기(N = 4 = 22)의 2승과 같습니다. 각 단계에서는 두 개의 "나비"가 공연되며 총 수는 변경되지 않습니다. 각 나비 연산은 하나의 곱셈 연산에 해당합니다. 비교를 위해 샘플링(f0,f1,f2,f3)을 사용하는 DFT에서는 곱셈 연산을 4×4 = 16회 수행해야 하며 FFT의 경우에는 4회만 수행하면 됩니다.

이 계열은 다음과 같이 작성할 수도 있습니다.

(2),
여기서 , k 번째 복소 진폭.

계수 (1)과 (3) 사이의 관계는 다음 공식으로 표현됩니다.

푸리에 급수의 이 세 가지 표현은 모두 완전히 동일합니다. 때로는 푸리에 급수로 작업할 때 사인과 코사인 대신 허수 인수의 지수를 사용하는 것이 더 편리합니다. 즉, 푸리에 변환을 복소수 형식으로 사용하는 것이 더 편리합니다. 그러나 푸리에 급수는 해당 진폭과 위상을 갖는 코사인의 합으로 표시되는 공식 (1)을 사용하는 것이 편리합니다. 어떤 경우든 실제 신호의 푸리에 변환으로 인해 복잡한 고조파 진폭이 발생한다고 말하는 것은 올바르지 않습니다. 위키가 정확하게 말했듯이, “푸리에 변환(?)은 실수 변수의 한 함수를 다른 함수, 즉 실수 변수와 연관시키는 연산입니다.”

총:
신호의 스펙트럼 분석을 위한 수학적 기초는 푸리에 변환입니다.

푸리에 변환을 사용하면 세그먼트(0, T)에 정의된 연속 함수 f(x)(신호)를 삼각 함수(사인 및/또는 코사인)의 무한 수(무한 계열)의 합으로 표현할 수 있습니다. 세그먼트(0, T)에서도 고려되는 진폭 및 위상. 이러한 계열을 푸리에 계열(Fourier series)이라고 합니다.

푸리에 변환을 신호 분석에 올바르게 적용하려면 이에 대한 이해가 필요한 몇 가지 사항을 더 살펴보겠습니다. 전체 X축에서 푸리에 급수(정현파의 합)를 고려하면 세그먼트(0, T) 외부에서 푸리에 급수로 표시되는 함수가 주기적으로 우리 함수를 반복하는 것을 알 수 있습니다.

예를 들어, 그림 7의 그래프에서 원래 함수는 세그먼트(-T\2, +T\2)에 정의되고, 푸리에 급수는 전체 x축에 정의된 주기 함수를 나타냅니다.

이는 정현파 자체가 주기 함수이고 따라서 그 합이 주기 함수가 되기 때문에 발생합니다.


그림.7 푸리에 급수에 의한 비주기적 원래 함수의 표현

따라서:

우리의 원래 함수는 연속적이고 비주기적이며 길이 T의 특정 세그먼트에서 정의됩니다.
이 함수의 스펙트럼은 이산적입니다. 즉, 고조파 성분의 무한 계열, 즉 푸리에 계열의 형태로 표시됩니다.
실제로 푸리에 급수는 세그먼트 (0, T)에서 우리와 일치하는 특정 주기 함수를 정의하지만 우리에게는 이 주기성이 중요하지 않습니다.

고조파 성분의 주기는 원래 함수 f(x)가 정의된 세그먼트(0, T) 값의 배수입니다. 즉, 고조파 주기는 신호 측정 기간의 배수입니다. 예를 들어, 푸리에 급수의 첫 번째 고조파 주기는 함수 f(x)가 정의되는 간격 T와 같습니다. 푸리에 급수의 두 번째 고조파의 주기는 간격 T/2와 같습니다. 등등 (그림 8 참조).


그림 8 푸리에 급수의 고조파 성분의 주기(주파수)(여기서 T = 2?)

따라서 고조파 성분의 주파수는 1/T의 배수가 됩니다. 즉, 고조파 성분 Fk의 주파수는 Fk = k\T와 동일하며, 여기서 k의 범위는 0부터 τ까지입니다. 예를 들어 k = 0 F0 = 0입니다. k=1 F1=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (주파수 0 - 상수 성분).

원래 기능을 T=1초 동안 기록된 신호로 둡니다. 그러면 첫 번째 고조파의 주기는 신호의 지속 시간 T1=T=1초와 같고 고조파 주파수는 1Hz가 됩니다. 두 번째 고조파의 주기는 신호 지속 시간을 2로 나눈 값(T2=T/2=0.5초)과 동일하며 주파수는 2Hz입니다. 3차 고조파의 경우 T3=T/3초이고 주파수는 3Hz입니다. 등등.

이 경우 고조파 사이의 간격은 1Hz입니다.

따라서 지속 시간이 1초인 신호는 1Hz의 주파수 분해능을 사용하여 고조파 성분으로 분해될 수 있습니다(스펙트럼 획득).
분해능을 0.5Hz까지 2배 높이려면 측정 기간을 2배(최대 2초) 늘려야 합니다. 10초 동안 지속되는 신호는 0.1Hz의 주파수 분해능을 사용하여 스펙트럼을 얻기 위해 고조파 성분으로 분해될 수 있습니다. 주파수 분해능을 높이는 다른 방법은 없습니다.

샘플 배열에 0을 추가하여 신호 지속 시간을 인위적으로 늘리는 방법이 있습니다. 그러나 실제 주파수 분해능은 증가하지 않습니다.

3. 이산 신호 및 이산 푸리에 변환

디지털 기술의 발전에 따라 측정 데이터(신호)를 저장하는 방식도 변화했습니다. 이전에는 신호를 테이프 레코더에 녹음하고 아날로그 형식으로 테이프에 저장할 수 있었다면 이제 신호는 디지털화되어 일련의 숫자(샘플)로 컴퓨터 메모리의 파일에 저장됩니다.

신호를 측정하고 디지털화하는 일반적인 방식은 다음과 같습니다.


그림 9 측정 채널 다이어그램

다음에서 보내는 신호 측정 변환기시간 T 동안 얻은 신호 샘플(샘플링)은 컴퓨터로 전송되어 메모리에 저장됩니다.


그림 10 디지털화된 신호 - 시간 T 동안 수신된 N 샘플

신호 디지털화 매개변수에 대한 요구사항은 무엇입니까? 입력된 아날로그 신호를 이산 코드( 디지털 신호)를 아날로그-디지털 변환기(ADC, 영어 Analog-to-digital Converter, ADC)라고 합니다(위키).

ADC의 주요 매개변수 중 하나는 최대 샘플링 주파수(또는 샘플링 속도, 영국식 샘플링 속도)입니다. 즉, 샘플링할 때 시간 연속 신호의 샘플링 속도입니다. 헤르츠 단위로 측정됩니다. ((위키))

Kotelnikov의 정리에 따르면 연속 신호가 주파수 Fmax에 의해 제한된 스펙트럼을 갖는 경우 시간 간격으로 채취한 이산 샘플로부터 완전하고 명확하게 재구성될 수 있습니다. , 즉. 주파수 Fd로? 2*Fmax, 여기서 Fd는 샘플링 주파수입니다. Fmax - 신호 스펙트럼의 최대 주파수. 즉, 신호 디지털화 주파수(ADC 샘플링 주파수)는 측정하려는 신호의 최대 주파수보다 최소 2배 이상 높아야 합니다.

Kotelnikov의 정리에서 요구하는 것보다 낮은 주파수로 샘플을 채취하면 어떻게 될까요?

이 경우, 고주파 신호가 디지털화 후 실제로 존재하지 않는 저주파 신호로 바뀌는 "앨리어싱" 효과(스트로보스코픽 효과, 모아레 효과라고도 함)가 발생합니다. 그림에서. 5개의 빨간색 고주파 사인파는 실제 신호입니다. 더 낮은 주파수의 청색 정현파는 샘플링 시간 동안 고주파 신호 기간의 절반 이상이 통과할 시간이 있다는 사실로 인해 발생하는 가상의 신호입니다.


쌀. 11. 샘플링 속도가 불충분하게 높을 때 잘못된 저주파 신호가 나타나는 경우

앨리어싱 효과를 방지하기 위해 특수 앨리어싱 방지 필터가 ADC 앞에 배치됩니다. LPF(저역 통과 필터)는 ADC 샘플링 주파수의 절반 미만의 주파수를 통과시키고 더 높은 주파수를 차단합니다.

이산 샘플에서 신호의 스펙트럼을 계산하기 위해 이산 푸리에 변환(DFT)이 사용됩니다. "정의에 따라" 이산 신호의 스펙트럼은 샘플링 주파수 Fd의 절반 미만인 주파수 Fmax에 의해 제한된다는 점을 다시 한 번 언급해 보겠습니다. 따라서 이산 신호의 스펙트럼은 스펙트럼이 무제한일 수 있는 연속 신호의 푸리에 계열에 대한 무한 합과 달리 유한 수의 고조파의 합으로 표현될 수 있습니다. Kotelnikov의 정리에 따르면 고조파의 최대 주파수는 최소한 두 개의 샘플을 차지해야 하므로 고조파 수는 이산 신호 샘플 수의 절반과 같습니다. 즉, 샘플에 N개의 샘플이 있으면 스펙트럼의 고조파 수는 N/2와 같습니다.

이제 이산 푸리에 변환(DFT)을 고려해 보겠습니다.

푸리에 급수와 비교

DFT의 시간이 본질적으로 이산적이며 고조파 수가 N/2(샘플 수의 절반)로 제한된다는 점을 제외하면 이들이 일치한다는 것을 알 수 있습니다.

DFT 공식은 무차원 정수 변수 k, s로 작성됩니다. 여기서 k는 신호 샘플 수이고, s는 스펙트럼 구성 요소 수입니다.
값 s는 기간 T(신호 측정 기간) 동안 완전한 고조파 진동 수를 나타냅니다. 이산 푸리에 변환은 수치적 방법을 사용하여 고조파의 진폭과 위상을 찾는 데 사용됩니다. "컴퓨터에서"

처음에 얻은 결과로 돌아갑니다. 위에서 언급한 것처럼 비주기 함수(신호)를 푸리에 급수로 확장하면 결과 푸리에 급수는 실제로 주기 T를 갖는 주기 함수에 해당합니다(그림 12).


그림 12 주기 T0, 측정 주기 T>T0의 주기 함수 f(x)

그림 12에서 볼 수 있듯이 함수 f(x)는 주기 T0으로 주기적입니다. 그러나 측정 샘플 T의 지속 시간이 함수 T0의 주기와 일치하지 않기 때문에 푸리에 급수로 얻은 함수는 점 T에서 불연속성을 갖습니다. 결과적으로 이 함수의 스펙트럼은 다음을 포함합니다. 다수의 고주파 고조파. 측정 샘플 T의 지속 시간이 함수 T0의 주기와 일치하는 경우 푸리에 변환 후에 얻은 스펙트럼에는 함수 f(x)가 있으므로 첫 번째 고조파(샘플링 지속 시간과 동일한 주기를 갖는 정현파)만 포함됩니다. 정현파이다.

즉, DFT 프로그램은 우리의 신호가 "정현파의 조각"이라는 것을 "모르지만", 개별 조각의 불일치로 인해 불연속성을 갖는 일련의 형태로 주기 함수를 표현하려고 시도합니다. 정현파.

결과적으로 스펙트럼에 고조파가 나타나며, 이는 이 불연속성을 포함하여 함수의 모양을 요약해야 합니다.

따라서 서로 다른 주기를 갖는 여러 정현파의 합인 신호의 "올바른" 스펙트럼을 얻으려면 각 정현파의 정수 주기가 신호 측정 주기에 맞아야 합니다. 실제로 이 조건은 충분히 긴 신호 측정 기간 동안 충족될 수 있습니다.


그림 13 기어박스 운동학적 오류 신호의 기능 및 스펙트럼 예

지속 시간이 짧을수록 사진이 "더 나빠" 보입니다.


그림 14 회전자 진동 신호의 함수와 스펙트럼의 예

실제로는 "실제 구성 요소"가 어디에 있는지, 구성 요소의 비다중 주기와 신호 샘플링 기간 또는 신호 형태의 "점프 및 중단"으로 인해 발생하는 "아티팩트"가 어디에 있는지 이해하기 어려울 수 있습니다. . 물론 "실제 구성 요소"와 "가공물"이라는 단어를 따옴표로 묶은 데에는 이유가 있습니다. 스펙트럼 그래프에 많은 고조파가 존재한다고 해서 신호가 실제로 고조파로 "구성"되어 있다는 의미는 아닙니다. 이는 숫자 7이 숫자 3과 4로 "구성된다"고 생각하는 것과 같습니다. 숫자 7은 숫자 3과 4의 합으로 표현될 수 있습니다. 이것이 맞습니다.

따라서 우리의 신호는... "우리의 신호"라기보다는 신호(샘플링)를 반복하여 구성된 주기 함수는 특정 진폭과 위상을 갖는 고조파(사인파)의 합으로 표현될 수 있습니다. 그러나 실습에 중요한 많은 경우(위 그림 참조) 스펙트럼에서 얻은 고조파를 본질적으로 주기적이며 신호 형태에 상당한 기여를 하는 실제 프로세스와 연관시키는 것이 실제로 가능합니다.

일부 결과

1. ADC에 의해 디지털화되고, 즉 이산 샘플 세트(N개)로 표시되는 T초 기간의 실제 측정 신호는 고조파 세트(N/ 2 조각).

2. 신호는 일련의 실수 값으로 표현되고 신호의 스펙트럼은 실수 값의 집합으로 표시됩니다. 고조파 주파수는 양수입니다. 수학자에게는 음의 주파수를 사용하여 스펙트럼을 복잡한 형태로 표현하는 것이 더 편리하다는 사실이 "이것이 옳다"거나 "항상 이루어져야 한다"는 의미는 아닙니다.

3. 시간 간격 T에 걸쳐 측정된 신호는 시간 간격 T에 대해서만 결정됩니다. 신호 측정을 시작하기 전에 무슨 일이 일어났고 그 후에 무슨 일이 일어날지는 과학에 알려지지 않았습니다. 그리고 우리의 경우에는 흥미롭지 않습니다. 시간 제한이 있는 신호의 DFT는 특정 조건에서 해당 구성 요소의 진폭과 주파수를 계산할 수 있다는 의미에서 "진정한" 스펙트럼을 제공합니다.

사용된 재료 및 기타 유용한 재료.

디스플레이 장치로는 2줄 문자 LCD 표시기가 사용됩니다. 이 프로젝트 구현의 주요 포인트는 하드웨어가 아니라 소프트웨어, 보다 정확하게는 8비트 마이크로 컨트롤러에서 이산 푸리에 변환(DFT)을 구현하는 것입니다. 저자는 이 분야의 전문가가 아니므로 간단한 이산 푸리에 변환을 사용하여 기본부터 시작했다는 점을 즉시 주목해야 합니다. 고속 푸리에 변환 알고리즘은 속도가 빠를 뿐만 아니라 상당히 복잡합니다.

이산 푸리에 변환(영문 DFT, 이산 푸리에 변환)은 디지털 신호 처리 알고리즘(해당 변형은 MP3의 오디오 압축, JPEG의 이미지 압축 등에 사용됨)뿐만 아니라 디지털 신호 처리 알고리즘에서 널리 사용되는 푸리에 변환 중 하나입니다. 이산(예: 디지털 아날로그) 신호의 주파수 분석과 관련된 기타 영역. 이산 푸리에 변환에는 이산 함수가 입력으로 필요합니다. 이러한 함수는 샘플링(연속 함수의 값 샘플링)을 통해 생성되는 경우가 많습니다.

스펙트럼 분석기의 개략도 소리 신호매우 간단하며 크게 디지털 부분과 아날로그 부분으로 나눌 수 있습니다.

디지털 부분은 마이크로 컨트롤러와 이에 연결된 LCD 표시기로 구성됩니다. 마이크로컨트롤러의 클럭은 다음과 같습니다. 석영 공진기 16MHz, +5V의 공급 전압이 마이크로컨트롤러 ADC의 기준 전압으로 사용됩니다.
LCD 표시기의 데이터 버스는 마이크로컨트롤러의 포트 C(입력/출력 라인 PC0-PC3)에 연결되고, 제어 버스는 마이크로컨트롤러의 포트 D(PD5, PD6)에 연결됩니다. 표시기는 4비트 모드에서 작동합니다. 명암 값이 4.7kOhm인 가변 저항이 대비를 조정하는 데 사용됩니다. 표시기로 작업하기 위해 분석기의 8개 수평 열을 표시하는 사용자 정의 기호가 생성되었으며, 이러한 사용자 정의 기호는 LCD 표시기의 RAM 64바이트를 모두 차지합니다.

마이크로컨트롤러는 외부 16MHz 석영 공진기에서 작동합니다.

장치의 아날로그 부분은 가장 중요한 부분이며 일렉트릿 마이크 신호의 전치 증폭기이며, 그 출력은 마이크로 컨트롤러에 내장된 ADC의 ADC0 채널에 연결됩니다. ADC 입력의 0 레벨을 정확히 기준 전압의 절반으로 설정해야 합니다. 즉, 2.5V. 이 경우 신호의 양의 반파장과 음의 반파장을 사용할 수 있지만 진폭은 설정된 한계를 초과해서는 안 됩니다. 과부하를 방지하려면 게인을 세밀하게 조정해야 합니다. 위의 모든 조건은 일반적인 저전력 연산 증폭기 마이크로 회로에 의해 충족됩니다.

DFT 알고리즘은 고속 푸리에 변환에 비해 약간 느립니다. 그러나 우리의 스펙트럼 분석기는 고속을 요구하지 않으며, 초당 약 30프레임의 업데이트 속도를 제공할 수 있다면 이는 오디오 신호의 스펙트럼을 시각화하는 데 충분할 것입니다. 어쨌든 우리 버전에서는 초당 100프레임의 속도를 달성할 수 있지만 이는 이미 2줄 문자 LCD 표시기에 대한 매개변수 값이 너무 높으므로 권장되지 않습니다. 32포인트 이산 푸리에 변환의 경우 샘플링 주파수는 20kHz이며 변환 결과가 대칭이므로 전반부만 사용하면 됩니다. 처음 16개 결과. 따라서 최대 10kHz의 주파수 스펙트럼을 표시할 수 있으며 분석기 분해능은 10kHz/16 = 625Hz입니다.

설계 작성자는 DFT 계산 속도를 높이려고 시도했습니다. 이 변환에 N개의 점이 있으면 사인과 코사인의 N2/2 값을 찾아야 합니다. 32포인트 변환을 위해서는 512개의 사인 및 코사인 값을 찾아야 합니다. 하지만 이를 찾기 전에 각도(도)를 계산해야 하는데 CPU 시간이 좀 걸리기 때문에 이러한 계산에는 값 테이블을 사용하기로 결정했습니다. 마이크로컨트롤러 프로그램에서 계산할 때 부동 소수점 및 배정밀도 숫자는 사용되지 않습니다. 8비트 마이크로컨트롤러에서 처리하는 데 시간이 더 오래 걸리기 때문입니다. 대신 조회 테이블의 값은 16비트 정수 데이터에 10000을 곱한 값을 사용합니다. 그런 다음 변환이 수행된 후 결과를 10000으로 나눕니다. 이 접근 방식을 사용하면 120개의 32포인트 변환을 수행할 수 있습니다. 둘째, 우리 장치에 충분합니다.

ATmega32 마이크로 컨트롤러에서 스펙트럼 분석기 작동 시연

다운로드

소스 코드(마이크로컨트롤러 프로그램, 사인, 코사인 및 각도 데이터 테이블) -

  • AVR에서 빛과 음악 이상으로 나아가는 것이 어렵다는 것은 분명하며 매개 변수가 올바르지 않습니다. 그러나 대부분의 작업에는 초당 120개의 32포인트 변환이면 충분할 수 있습니다. 물론 625Hz의 또 다른 샘플을 선택하거나 새로 고침 빈도를 잃을 수도 있습니다. MK가 기분이 좋지 않을 것이라는 점은 주목할 가치가 있으며 성능 측면에서 고정할 수 있는 것이 거의 없습니다. 그러나 여기에서는 하드웨어 데이터 전송 방법을 사용하여 결과 출력을 구성할 수 있습니다. 그런 다음 보조 마이크로 컨트롤러가 되며 기본 마이크로 컨트롤러는 이로부터 데이터만 수신하여 다른 프로세스와 호환하여 처리합니다. 대체로 여전히 프로세서의 주파수에 따라 다릅니다. 옛날에는 20MHz 이상의 메가 오버클럭이 가능했지만 이러한 작업의 경우 아마도 고주파수에서만 결함이 발생할 것입니다. 아이디어는 좋습니다. 수학 부분이 더 많이 작성된다면... MK에서의 구현입니다.
  • 또한 더 흥미로운 분석기를 만들었습니다. You Tube 또는 컬러 LCD 버전: You Tube는 유명한 Chen 라이브러리를 기반으로 합니다. :)
  • "각도(도)를 계산해야 합니다." 이 테이블의 값이 어떻게 계산되는지 자세히 알려주실 수 있는 분 계신가요?
  • 사인과 코사인 표를 보면 모든 것이 명확해집니다. Degree_lookup 테이블의 값이 어떻게 계산되는지 명확하지 않습니까?

모든 신호는 여러분이 만들어낸 것이든 우주에서 관찰한 것이든 실제로는 서로 다른 주파수의 단순한 사인파의 합일 뿐입니다.

저는 16x2 LCD와 ATmega32 마이크로컨트롤러로 작은 오디오 스펙트럼 분석기(0~10kHz)를 만들었습니다. 저는 간단한 DFT(Discrete Fourier Transform)로 시작했습니다. FFT(Fast Fourier Transform)는 더 빠른 속도와 약간 더 복잡한 알고리즘만 DFT와 다르므로 사용하지 않았으며 나중에 추가할 수도 있습니다.

DFT는 FFT에 비해 느립니다. 내 LCD 스펙트럼 분석기에는 FFT가 제공할 수 있는 고속이 필요하지 않으며 화면의 이미지가 약 30프레임/초의 속도로 변경된다면 이는 오디오 스펙트럼을 시각화하기에 충분합니다. 하지만 이미 약 100fps를 달성할 수 있지만 LCD의 경우 새로 고침 빈도가 너무 높은 것은 권장되지 않습니다. 20kHz로 샘플링된 오디오는 32개의 DFT 포인트를 생성합니다. 변환 결과는 대칭이므로 처음 16개 결과만 사용하면 됩니다. 따라서 최대 주파수는 10kHz입니다. 따라서 10kHz/16 = 625Hz입니다.

DFT 계산 속도를 높이려고 했습니다. N DFT 점이 있는 경우 사인과 코사인(N^2)/2를 찾아야 하며, 32점 DFT의 경우 512의 사인과 코사인을 찾아야 합니다. CPU 시간을 차지하는 각도(도)를 찾아야 합니다. 이를 위해 사인과 코사인에 대한 테이블을 만들었습니다. 사인과 코사인 값에 10000을 곱하여 사인과 코사인 16비트 변수를 만들었습니다. 변환 후 각 결과를 10000으로 나누어야 합니다. 이제 초당 120개의 32포인트 DFT를 계산할 수 있습니다. 스펙트럼 분석기로는 충분합니다.

표시하다

저는 64바이트 온보드 LCD 메모리에 로드된 맞춤형 LCD 문자를 사용했습니다. 나는 16x2 LCD가 스펙트럼 분석기 디스플레이로 사용되고 그 아이디어를 사용한 비디오를 온라인에서 보았습니다.

오디오 입력

스펙트럼 분석기의 가장 중요한 부분 중 하나는 일렉트릿 마이크에서 신호를 수집하는 것입니다. 발전에 특별한 관심을 기울여야 함 프리앰프마이크용. ADC 입력에서 0 레벨을 설정하고 최대 레벨을 공급 전압의 절반과 동일하게 설정해야 합니다. 2.5V. -2.5V ~ +2.5V의 전압을 공급받을 수 있습니다. 프리앰프는 이러한 제한을 초과하지 않도록 구성되어야 합니다. 마이크 프리앰프로 LM324 연산 증폭기를 사용했습니다.

방사성 원소 목록

지정 유형 명칭 수량 메모가게내 메모장
표시하다
MK AVR 8비트

ATmega32

1 메모장으로
콘덴서22pF2 메모장으로
콘덴서0.1μF1 메모장으로
전해콘덴서100μF1 메모장으로
저항기

100옴

1 메모장으로
트리머 저항기4.7k옴1 메모장으로
석영 공진기16MHz1 메모장으로
LCD 디스플레이16x21 메모장으로
전원 장치5V1 메모장으로
오디오 입력
U1 연산 증폭기

LM324

1 메모장으로
C1 콘덴서1μF1 메모장으로
C8 콘덴서0.01μF1 메모장으로
R1 저항기

220kΩ

1 메모장으로
R2, R3 저항기

10kΩ

2 메모장으로
R4, R9 저항기

1kΩ

2 메모장으로
R5 저항기

간단한 정수 코어와 부동 소수점 데이터를 처리하는 C6000 제품군 하위 제품군과 같은 괴물을 모두 포함하는 Texas Instruments TMS320 시리즈의 DSP와 같은 디지털 신호 처리(DSP)를 위한 특수 프로세서가 많이 있습니다. Analog Devices의 전체 ADSP 시리즈(다소 범용 BlackFin 포함)가 있으며 더 많은 제품도 있습니다. 간단한 솔루션 MicroChip에서 - dsPIC.

하지만 특화된 DSP는 좋지만 항상 그렇게 필요한가요? 예, 엄청난 정보 흐름으로 인해 대체할 수 없지만 더 간단한 처리 작업도 있습니다. 특히 저는 이중 변환 작업에 관심이 있었습니다. 즉, 오디오 신호를 컨볼루션하여 스펙트럼을 얻은 다음 스펙트럼에 대해 모든 작업을 수행하고 역변환을 수행하여 처리된 신호를 얻는 작업에 관심이 있었습니다. 이 모든 작업은 실시간으로 수행되어야 하며 전화 품질보다 낮은 품질을 확보해야 합니다.

지금은 2000년이 아니며 가격이 크게 하락한 고성능 ARM7/Cortex-M3 코어를 기반으로 한 단일 칩 솔루션이 있습니다. 이들은 32비트이며 32비트 곱셈 연산을 하드웨어로 구현합니다. , 거의 DSP 곱셈-누산 연산 및 64비트 결과), Cortex-M3에는 하드웨어 분할도 포함됩니다.

신호 처리는 내 전문 분야가 아니며 거의 모든 지식 (또는 원리에 대한 이해)이 연구소에서 보존되었지만 이제는 테스트하고 구현하고 싶었습니다. 즉, 설명, 개념 대체 등이 부정확할 수 있다는 것입니다. 사실 학문적 정확성은 별로 걱정하지 않았습니다.

거의 모든 DSP의 경우 위에 설명된 작업은 간단하고 간단합니다. 하지만 범용 RISC 코어는 어떻게 작동할까요? AVR이나 PIC를 고려한다면 그것만으로는 충분하지 않을 것입니다. 8비트 및 낮은 클럭 주파수가 영향을 미칩니다. 하지만 Elm-Chan은 AVR에서 FFT를 수행하고 신호의 스펙트럼을 그리는 설계를 가지고 있습니다. 그러나 이 경우에는 실시간으로 단순히 시각화만 수행되며(최소 처리 정확도로) 허용 가능한 오디오 품질로 신호 처리가 완료되지 않습니다.

LPC2146은 ARM7TDMI-S 코어를 기반으로 하고 최대 클록 주파수가 60MHz인 실험용 칩으로 선택되었습니다(실제로는 72MHz 또는 84MHz에서도 작동하지 않음). 왜? 첫째, 디버그 보드가 있고, 둘째, 보드에 ADC와 DAC가 있습니다. 최소한의 외부 트림이 필요합니다.

약간의 이론

우선, ARM 마이크로컨트롤러에서 FFT(Fast Fourier Transform) 성능을 평가하는 것이 흥미로웠습니다. 이 평가를 바탕으로 오디오 데이터 스트림을 처리하기에 충분한 속도가 있는지, 그리고 이러한 마이크로 컨트롤러에서 처리할 수 있는 샘플링 주파수와 채널 수는 무엇인지 결론을 내릴 수 있습니다.

푸리에 변환을 기반으로 매우 매력적인 특성을 지닌 영리한 필터를 구축할 수 있습니다. 나는 주로 신호의 톤을 변경하는 문제(스펙트럼을 높이거나 낮추는 것)와 스펙트럼을 "반사"하는 문제에 관심이 있었습니다. 후자는 SDR 라디오에서 LSB 하위 측파대 라디오 방송을 청취하는 데 필요합니다.

나는 당신에게 이론을로드하지 않고 푸리에 변환이 무엇인지 설명하지 않을 것입니다. 이 주제에 대해 내가 사용한 것 중에서 꽤 많은 자료가 있습니다: 아주 훌륭하고 유익한 책의 한 장과 위키.

소프트웨어 구현

FFT의 소프트웨어 구현이 많이 있지만 제가 직접 작성했습니다. 제가 추구한 주요 목표는 특정 아키텍처에 맞게 코드를 최적화하는 것이었습니다. 첫째, 곧바로 32비트에 집중했고, 둘째, 정수 계산만 필요하고 나누기 연산은 피하는 것이 바람직했다. 이러한 요구 사항을 충족하기 위해 기성품을 찾는 것은 이미 문제가 있습니다.

미리 계산할 수 있는 모든 상수를 계산하여 표(주로 삼각함수의 값)로 정리하였습니다. 이것이 알고리즘의 주요 최적화입니다. 그렇지 않으면 설명된 알고리즘을 거의 완전히 반복합니다.

가장 중요한 것은 정수 계산에 대한 요구 사항입니다. 구현 과정에서 32비트 루프 변수 중 하나에서 오버플로가 발생하는 오류도 발생했습니다. 게다가 모든 테스트 데이터에 나타나지 않아서 발견되기까지 꽤 골치 아픈 일이었습니다.

모든 원본 텍스트를 하나의 아카이브에 모았습니다. 구현이 최종적이지 않고 중복 계산이 있으며(스펙트럼 및 위상 대칭은 고려되지 않음) 현재 계산에 너무 많은 버퍼가 사용되므로 버퍼 사용 최적화가 필요합니다. 랜덤 액세스 메모리(1024 포인트 변환의 ​​경우 거의 12k).

첫 번째 테스트

드럼 롤: 1024포인트 샘플의 변환 속도를 테스트하고 있으며 프로세서 코어 주파수는 60MHz입니다. 테스트는 에뮬레이터에서 진행되었기 때문에 100% 정확하다고 주장할 수는 없지만 이 결과는 지표로 사용할 수 있습니다(이전 경험에서는 에뮬레이터가 거짓말을 했지만 그다지 많지는 않았습니다). 코드의 첫 번째 버전, RealView MDK 컴파일러, O3 최적화 옵션, ARM 코드 생성 모드를 테스트합니다.

그래서 우리가 보는 것은:

각 변환에 6ms, 왕복 변환의 경우 총 12ms가 조금 넘습니다. 44100Hz(오디오 표준)의 샘플링 주파수와 최대 16비트 해상도의 샘플을 사용하면 순수 계산에 ~44*12ms = 528ms가 소요되는 것으로 나타났습니다. 그리고 이것은 일부 코드 최적화가 아직 완료되지 않은 펌웨어의 중간 버전에 있습니다(추정에 따르면 알고리즘은 거의 2배 가속화될 수 있습니다)! 제 생각에는 그것은 단지 훌륭한 지표일 뿐입니다.

전체적으로 코어 부하는 약 50%가 될 것으로 예상되며, ADC, DAC 및 기타 데이터 전송 작업 시 스펙트럼 및 오버헤드 비용에 대한 변환을 위해 추가 50%가 남아 있습니다. 샘플링 주파수를 "전화" 수준(약 4800-9600Hz)으로 낮추면 코어 부하는 더욱 낮아집니다(약 15-30%).

따라서 수학적 부분은 다소 명확합니다. 구체적인 구현을 진행할 수 있습니다.

테스트 플랫폼으로는 스피커가 있는 Keil MCB2140 개발 보드를 사용했습니다. 미니잭 코드는 납땜되어 장치의 선형 출력에 연결되며 간단한 입력 체인이 조립됩니다. 이미 언급했듯이 보드에는 마이크로 컨트롤러의 아날로그 출력에 연결된 스피커가 이미 있으며 컨트롤(버튼 및 전위차계)이 있습니다.

다음은 입력 회로의 스케치입니다.


소프트웨어 디버깅은 다음 단계로 이루어졌습니다.

  1. 필요한 모든 주변 장치 디버깅: ADC, DAC, 타이머, LED 표시.
  2. 신호 디지털화 테스트: 필요한 속도로 데이터를 디지털화하여 버퍼에 넣은 다음 버퍼에서 데이터를 추출하여 신호를 재생합니다. 저것들. 변환 없이 시간에 따른 간단한 신호 이동. 이 단계에서는 추가 작업에 필요한 2개의 버퍼를 사용하는 메커니즘이 테스트됩니다.
  3. 에게 이전 버전직접 및 역 푸리에 변환이 추가됩니다. 이 테스트는 최종적으로 FFT 코드의 올바른 작동을 확인하고 코드가 사용 가능한 성능에 맞는지 확인합니다.
  4. 그 후, 애플리케이션의 주요 뼈대가 완성되면 실제 애플리케이션으로 넘어갈 수 있습니다.

코드에 FFT를 추가한 후 문제가 발생했습니다. 신호에 외부 소음과 휘파람 소리가 나타났습니다. 일반적으로 이러한 행동은 나에게 꽤 이상하게 보였습니다. 왜냐하면... 변환 없이 디지털 경로를 통과하는 신호는 상당히 깨끗한 상태로 유지되었습니다. 이에 대한 첫 번째 이유: 아날로그 회로 이후 ADC의 신호 진폭은 최대(0-3.3V)가 아니었지만 플레이어의 최대 볼륨에서 0.5-2V 이내였습니다. 두 번째: 정수로 인해 상당히 강한 노이즈 계산(+-1 단위, 청각 간섭을 유발하기에 충분한 것으로 판명됨).

첫 번째 문제를 해결하기 위해 아날로그 부분 조정을 시작하기로 결정했습니다. 그리고 노이즈 문제를 해결하려면 저역통과 필터를 사용해 보세요.

응용 프로그램 1: 신호 톤 변경

보드에는 전위차계( 가변 저항기), 제어에 사용될 수 있습니다. 이 경우 신호 스펙트럼이 위아래로 이동하도록 설정하여 좋아하는 구성을 "변환"하기에 충분합니다.

주파수 영역에서는 다음과 같은 일이 발생합니다.


이 경우 변환 결과는 2개의 버퍼에 포함됩니다. 한 버퍼는 실수 부분이고 다른 버퍼는 허수 부분입니다. 여기서 얻은 숫자의 물리적 의미: 실수 부분에는 고조파 값이 포함되고, 허수 부분에는 이러한 고조파에 대한 위상 변화가 포함됩니다. 게다가, 보시다시피 초기 신호는 N-값으로 기술되고, 변환 후에는 2N-값이 얻어집니다. 정보량은 변하지 않으며, 버퍼 데이터가 값의 중복 형태로 중복성을 가지기 때문에 정보량의 2배 증가가 발생한다.




맨 위