Applicazione pratica della trasformata di Fourier per l'elaborazione dei segnali. Elaborazione del segnale digitale su microcontrollori ARM7 Trasformata di Fourier avr

Il teorema di Fourier afferma che qualsiasi segnale può essere espanso in una serie in un insieme ortonormale di funzioni periodiche (ad esempio seno e coseno) con frequenze multiple della frequenza del segnale periodico. Pertanto, l'analisi spettrale di un segnale si basa sulla ricerca di coefficienti di ponderazione (in generale complessi), il cui modulo corrisponde alla frazione della potenza di oscillazione dell'armonica corrispondente introdotta nella sovrapposizione generale di tutte le armoniche.

Trasformata veloce di Fourier

La trasformata veloce di Fourier è un algoritmo di calcolo che sfrutta con successo le proprietà di periodicità delle funzioni trigonometriche per evitare calcoli non necessari nella trasformata discreta di Fourier (DFT), rendendo così più veloce la ricerca dei coefficienti nell'espansione di Fourier. La differenza principale rispetto alla conversione discreta sta solo nel metodo di calcolo dei valori numerici (algoritmo) e non nell'elaborazione del segnale stessa. Sia nel caso della FFT che nel caso della DFT il risultato dei calcoli è lo stesso. L'unico requisito per l'algoritmo FFT è una dimensione del campione che sia un multiplo di N = 2L, dove L è un qualsiasi numero intero positivo. Gli algoritmi FFT in base 2 più comuni sono: decimato in tempo e decimato in frequenza.

In questo lavoro viene implementato un algoritmo FFT radix-2 con time thinning (algoritmo di Cooley-Tukey). È facile da ottenere studiando alcune leggi del DFT. Introduciamo il cosiddetto coefficiente di rotazione:

In questo caso, nella DFT, i coefficienti di Fourier per un numero di valori di segnale (f0,f1,…,fN-1) sono espressi dalla relazione:

Consideriamo una serie di segnali di 4 valori: (f0,f1,f2,f3). Presentiamo la trasformata di Fourier sotto forma di matrice (il coefficiente di normalizzazione 1/N è incluso nel vettore colonna Cij sul lato destro dell'espressione):

Dopo aver scritto i coefficienti di rotazione utilizzando la formula di Eulero e determinato i loro valori per k = 0, 1, 2,.. 9, puoi costruire un diagramma (Fig. 2), da cui puoi vedere lo schema dei coefficienti ripetuti.

Figura 2. Serie di potenze w per N=4

Sostituendo i valori numerici nella (4) otteniamo:

Cioè i valori di w, a partire da w4, sono pari al corrispondente valore da w0 a w3. Successivamente, riscriviamo l'equazione di matrice (4) in una forma non standard (notazioni simili vengono introdotte per chiarezza di ulteriori operazioni):

Scambiamo le colonne della matrice, dividendola in due gruppi: per gli indici pari f0, f2 e dispari f1, f3:

Teniamo presente che wk+1 = wkw1, allora l'espressione (6) verrà riscritta come:

Utilizzando i rapporti:

Otteniamo i coefficienti di espansione richiesti sotto forma di un vettore colonna con valori di cella:

La rappresentazione grafica dell'algoritmo (Fig. 3) assomiglia ad una farfalla con le ali aperte, motivo per cui questo metodo di calcolo è chiamato “farfalla”.

Figura 3. Grafico a farfalla per una serie di 4 termini

Quindi, nella prima fase dell'algoritmo, i membri di un numero di valori del segnale sono divisi in indici pari e dispari. Successivamente viene eseguito il grafico “a farfalla”, composto da due stadi, il cui numero è pari alla potenza di due della dimensione del campione (N = 4 = 22). Ad ogni fase vengono eseguite due “farfalle” e il loro numero totale rimane invariato. Ogni operazione della farfalla corrisponde ad un'operazione di moltiplicazione. Per fare un confronto: nella DFT con campionamento (f0,f1,f2,f3), l'operazione di moltiplicazione dovrebbe essere eseguita 4×4 = 16 volte, e nel caso della FFT solo 4 volte.

Questa serie può anche essere scritta come:

(2),
dove , k-esima ampiezza del complesso.

La relazione tra i coefficienti (1) e (3) è espressa dalle seguenti formule:

Si noti che tutte queste tre rappresentazioni della serie di Fourier sono completamente equivalenti. A volte, quando si lavora con le serie di Fourier, è più conveniente utilizzare gli esponenti dell'argomento immaginario anziché i seni e i coseni, ovvero utilizzare la trasformata di Fourier in forma complessa. Ma per noi è conveniente usare la formula (1), dove la serie di Fourier è presentata come una somma di coseni con le corrispondenti ampiezze e fasi. In ogni caso, non è corretto affermare che la trasformata di Fourier di un segnale reale darà come risultato ampiezze armoniche complesse. Come dice correttamente Wiki, “La trasformata di Fourier (?) è un’operazione che associa una funzione di una variabile reale con un’altra funzione, anch’essa una variabile reale”.

Totale:
La base matematica per l'analisi spettrale dei segnali è la trasformata di Fourier.

La trasformata di Fourier permette di rappresentare una funzione continua f(x) (segnale), definita sul segmento (0, T) come somma di un numero infinito (serie infinita) di funzioni trigonometriche (seno e/o coseno) con determinati ampiezze e fasi, considerate anche sul segmento (0, T). Una serie di questo tipo è chiamata serie di Fourier.

Notiamo alcuni altri punti, la cui comprensione è necessaria per la corretta applicazione della trasformata di Fourier all'analisi dei segnali. Se consideriamo la serie di Fourier (la somma delle sinusoidi) su tutto l'asse X, possiamo vedere che al di fuori del segmento (0, T) la funzione rappresentata dalla serie di Fourier ripeterà periodicamente la nostra funzione.

Ad esempio, nel grafico di Fig. 7, la funzione originale è definita sul segmento (-T\2, +T\2), e la serie di Fourier rappresenta una funzione periodica definita sull'intero asse x.

Ciò accade perché le sinusoidi stesse sono funzioni periodiche e di conseguenza la loro somma sarà una funzione periodica.


Fig.7 Rappresentazione di una funzione originale non periodica mediante una serie di Fourier

Così:

La nostra funzione originaria è continua, non periodica, definita su un certo segmento di lunghezza T.
Lo spettro di questa funzione è discreto, cioè si presenta sotto forma di una serie infinita di componenti armoniche: la serie di Fourier.
Infatti la serie di Fourier definisce una certa funzione periodica che coincide con la nostra sul segmento (0, T), ma per noi questa periodicità non è significativa.

I periodi delle componenti armoniche sono multipli del valore del segmento (0, T) su cui è definita la funzione originaria f(x). In altre parole, i periodi armonici sono multipli della durata della misura del segnale. Ad esempio, il periodo della prima armonica della serie di Fourier è uguale all'intervallo T su cui è definita la funzione f(x). Il periodo della seconda armonica della serie di Fourier è uguale all'intervallo T/2. E così via (vedi Fig. 8).


Fig.8 Periodi (frequenze) delle componenti armoniche della serie di Fourier (qui T = 2?)

Di conseguenza, le frequenze delle componenti armoniche sono multipli di 1/T. Cioè le frequenze delle componenti armoniche Fk sono pari a Fk = k\T, dove k varia da 0 a?, ad esempio k = 0 F0 = 0; k=1 F1=1\T; k=2 F2=2\T; k=3 F3=3\T;… Fk= k\T (a frequenza zero - componente costante).

Sia la nostra funzione originale un segnale registrato durante T=1 sec. Allora il periodo della prima armonica sarà pari alla durata del nostro segnale T1=T=1 sec e la frequenza armonica sarà 1 Hz. Il periodo della seconda armonica sarà pari alla durata del segnale divisa per 2 (T2=T/2=0,5 sec) e la frequenza sarà 2 Hz. Per la terza armonica T3=T/3 sec e la frequenza è 3 Hz. E così via.

Il passo tra le armoniche in questo caso è 1 Hz.

Pertanto, un segnale della durata di 1 secondo può essere scomposto in componenti armoniche (ottenendo uno spettro) con una risoluzione in frequenza di 1 Hz.
Per aumentare la risoluzione di 2 volte fino a 0,5 Hz, è necessario aumentare la durata della misurazione di 2 volte, fino a 2 secondi. Un segnale della durata di 10 secondi può essere scomposto in componenti armoniche (per ottenere uno spettro) con una risoluzione in frequenza di 0,1 Hz. Non esistono altri modi per aumentare la risoluzione della frequenza.

Esiste un modo per aumentare artificialmente la durata di un segnale aggiungendo zeri all'array di campioni. Ma non aumenta l'effettiva risoluzione della frequenza.

3. Segnali discreti e trasformata discreta di Fourier

Con lo sviluppo della tecnologia digitale sono cambiate anche le modalità di memorizzazione dei dati di misura (segnali). Se prima un segnale poteva essere registrato su un registratore e memorizzato su nastro in forma analogica, ora i segnali vengono digitalizzati e archiviati in file nella memoria del computer come una serie di numeri (campioni).

Lo schema usuale per misurare e digitalizzare un segnale è il seguente.


Fig.9 Schema del canale di misura

Segnale da trasduttore di misura arriva all'ADC durante un periodo di tempo T. I campioni di segnale (campionamento) ottenuti durante il tempo T vengono trasferiti al computer e archiviati in memoria.


Fig. 10 Segnale digitalizzato - N campioni ricevuti durante il tempo T

Quali sono i requisiti per i parametri di digitalizzazione del segnale? Un dispositivo che converte un segnale analogico in ingresso in un codice discreto ( segnale digitale) è chiamato convertitore analogico-digitale (ADC, inglese Analog-to-digital converter, ADC) (Wiki).

Uno dei parametri principali dell'ADC è la frequenza di campionamento massima (o frequenza di campionamento, frequenza di campionamento inglese) - la frequenza di campionamento di un segnale continuo nel tempo durante il campionamento. Si misura in Hertz. ((Wiki))

Secondo il teorema di Kotelnikov, se un segnale continuo ha uno spettro limitato dalla frequenza Fmax, allora può essere ricostruito completamente e inequivocabilmente dai suoi campioni discreti prelevati ad intervalli di tempo , cioè. con frequenza Fd? 2*Fmax, dove Fd è la frequenza di campionamento; Fmax - frequenza massima dello spettro del segnale. In altre parole, la frequenza di digitalizzazione del segnale (frequenza di campionamento dell'ADC) deve essere almeno 2 volte superiore alla frequenza massima del segnale che vogliamo misurare.

Cosa accadrà se prendiamo campioni con una frequenza inferiore a quella richiesta dal teorema di Kotelnikov?

In questo caso si verifica l'effetto “aliasing” (noto anche come effetto stroboscopico, effetto moiré), in cui un segnale ad alta frequenza, dopo la digitalizzazione, si trasforma in un segnale a bassa frequenza, che in realtà non esiste. Nella fig. 5 onda sinusoidale rossa ad alta frequenza è un segnale reale. Una sinusoide blu di frequenza inferiore è un segnale fittizio che nasce dal fatto che durante il tempo di campionamento ha tempo di passare più della metà del periodo del segnale ad alta frequenza.


Riso. 11. La comparsa di un falso segnale a bassa frequenza con una frequenza di campionamento non sufficientemente elevata

Per evitare l'effetto aliasing, uno speciale filtro anti-aliasing è posizionato davanti all'ADC, un filtro passa-basso (LPF), che lascia passare le frequenze inferiori alla metà della frequenza di campionamento dell'ADC e taglia le frequenze più alte.

Per calcolare lo spettro di un segnale dai suoi campioni discreti, viene utilizzata la trasformata discreta di Fourier (DFT). Notiamo ancora una volta che lo spettro di un segnale discreto “per definizione” è limitato dalla frequenza Fmax, che è inferiore alla metà della frequenza di campionamento Fd. Pertanto, lo spettro di un segnale discreto può essere rappresentato dalla somma di un numero finito di armoniche, a differenza della somma infinita della serie di Fourier di un segnale continuo, il cui spettro può essere illimitato. Secondo il teorema di Kotelnikov, la frequenza massima di un'armonica deve essere tale da rappresentare almeno due campioni, quindi il numero di armoniche è pari alla metà del numero di campioni di un segnale discreto. Cioè, se ci sono N campioni nel campione, allora il numero di armoniche nello spettro sarà uguale a N/2.

Consideriamo ora la trasformata discreta di Fourier (DFT).

Confronto con la serie di Fourier

Vediamo che coincidono, tranne per il fatto che il tempo nella DFT è di natura discreta e il numero di armoniche è limitato da N/2, metà del numero di campioni.

Le formule DFT sono scritte in variabili intere adimensionali k, s, dove k sono i numeri di campioni di segnale, s sono i numeri di componenti spettrali.
Il valore s mostra il numero di oscillazioni armoniche complete nel periodo T (durata della misurazione del segnale). La trasformata discreta di Fourier viene utilizzata per trovare le ampiezze e le fasi delle armoniche utilizzando un metodo numerico, ad es. "sul computer"

Ritornando ai risultati ottenuti all'inizio. Come accennato in precedenza, quando si espande una funzione non periodica (il nostro segnale) in una serie di Fourier, la serie di Fourier risultante corrisponde effettivamente a una funzione periodica con periodo T (Fig. 12).


Fig. 12 Funzione periodica f(x) con periodo T0, con periodo di misura T>T0

Come si vede in Fig. 12, la funzione f(x) è periodica con periodo T0. Tuttavia, poiché la durata del campione di misura T non coincide con il periodo della funzione T0, la funzione ottenuta come serie di Fourier presenta una discontinuità nel punto T. Di conseguenza, lo spettro di questa funzione conterrà un gran numero di armoniche ad alta frequenza. Se la durata del campione di misura T coincidesse con il periodo della funzione T0, allora lo spettro ottenuto dopo la trasformata di Fourier conterrebbe solo la prima armonica (sinusoide con periodo pari alla durata del campionamento), poiché la funzione f(x) è una sinusoide.

In altre parole, il programma DFT “non sa” che il nostro segnale è un “pezzo di sinusoide”, ma cerca di rappresentare una funzione periodica sotto forma di serie, che presenta una discontinuità dovuta all’incoerenza dei singoli pezzi di la sinusoide.

Di conseguenza, nello spettro compaiono delle armoniche, che dovrebbero riassumere la forma della funzione, inclusa questa discontinuità.

Pertanto, per ottenere lo spettro “corretto” di un segnale, che è la somma di più sinusoidi con periodi diversi, è necessario che un numero intero di periodi di ciascuna sinusoide rientri nel periodo di misurazione del segnale. In pratica, questa condizione può essere soddisfatta per una durata sufficientemente lunga della misurazione del segnale.


Fig. 13 Esempio della funzione e dello spettro del segnale di errore cinematico del cambio

Con una durata più breve, l'immagine apparirà “peggiore”:


Fig. 14 Esempio della funzione e dello spettro di un segnale di vibrazione del rotore

In pratica può essere difficile capire dove sono i “componenti reali” e dove sono gli “artefatti” causati dai periodi non multipli dei componenti e dalla durata del campionamento del segnale o da “salti e rotture” nella forma del segnale . Naturalmente, le parole “componenti reali” e “artefatti” sono messe tra virgolette per un motivo. La presenza di molte armoniche sul grafico dello spettro non significa che il nostro segnale effettivamente “costituisca” da esse. Ciò equivale a pensare che il numero 7 “sia costituito” dai numeri 3 e 4. Il numero 7 può essere rappresentato come la somma dei numeri 3 e 4: questo è corretto.

Quindi il nostro segnale… anzi nemmeno “il nostro segnale”, ma una funzione periodica composta dalla ripetizione del nostro segnale (campionamento) può essere rappresentata come una somma di armoniche (onde sinusoidali) con determinate ampiezze e fasi. Ma in molti casi importanti per la pratica (vedi figure sopra), è effettivamente possibile associare le armoniche ottenute nello spettro con processi reali che sono di natura ciclica e danno un contributo significativo alla forma del segnale.

Alcuni risultati

1. Un segnale reale misurato della durata di T secondi, digitalizzato da un ADC, cioè rappresentato da un insieme di campioni discreti (N pezzi), ha uno spettro discreto non periodico, rappresentato da un insieme di armoniche (N/ 2 pezzi).

2. Il segnale è rappresentato da un insieme di valori reali e il suo spettro è rappresentato da un insieme di valori reali. Le frequenze armoniche sono positive. Il fatto che sia più conveniente per i matematici rappresentare lo spettro in forma complessa utilizzando frequenze negative non significa che “questo sia corretto” e “dovrebbe essere sempre fatto”.

3. Un segnale misurato su un intervallo di tempo T è determinato solo su un intervallo di tempo T. Cosa è successo prima che iniziassimo a misurare il segnale, e cosa accadrà dopo, è sconosciuto alla scienza. E nel nostro caso, non è interessante. La DFT di un segnale limitato nel tempo fornisce il suo “vero” spettro, nel senso che, in determinate condizioni, permette di calcolare l'ampiezza e la frequenza delle sue componenti.

Materiali utilizzati e altri materiali utili.

Come dispositivo di visualizzazione viene utilizzato un indicatore LCD a due righe di caratteri. Il punto principale nella realizzazione di questo progetto non è l'hardware, ma il software, più precisamente l'implementazione della trasformata discreta di Fourier (DFT) su un microcontrollore a 8 bit. Va notato subito che l'autore non è un esperto in questo campo e quindi è partito dalle basi, con una semplice trasformata discreta di Fourier. L'algoritmo della trasformata veloce di Fourier non è solo veloce, ma anche piuttosto complesso.

La Trasformata Discreta di Fourier (nella letteratura inglese DFT, Discrete Fourier Transform) è una delle trasformate di Fourier ampiamente utilizzate negli algoritmi di elaborazione del segnale digitale (le sue modifiche sono utilizzate nella compressione audio in MP3, nella compressione delle immagini in JPEG, ecc.), nonché nella altre aree relative all'analisi delle frequenze in un segnale discreto (ad esempio analogico digitalizzato). La trasformata discreta di Fourier richiede una funzione discreta come input. Tali funzioni vengono spesso create mediante campionamento (campionamento di valori da funzioni continue).

Rappresentazione schematica di un analizzatore di spettro segnale sonoroè molto semplice e può essere approssimativamente suddiviso in parti digitali e analogiche.

La parte digitale è formata da un microcontrollore e da un indicatore LCD ad esso collegato. Il microcontrollore è sincronizzato da risuonatore al quarzo 16 MHz, la tensione di alimentazione di +5 V viene utilizzata come tensione di riferimento per l'ADC del microcontrollore.
Il bus dati dell'indicatore LCD è collegato alla porta C del microcontrollore (linee di ingresso/uscita PC0-PC3), il bus di controllo è collegato alla porta D (PD5, PD6) del microcontrollore. L'indicatore funziona in modalità a 4 bit. Per regolare il contrasto viene utilizzato un resistore variabile con un valore nominale di 4,7 kOhm. Per lavorare con l'indicatore, sono stati creati simboli personalizzati per visualizzare 8 colonne orizzontali dell'analizzatore; questi simboli personalizzati occupano tutti i 64 byte di RAM dell'indicatore LCD.

Il microcontrollore funziona da un risonatore al quarzo esterno da 16 MHz.

La parte analogica del dispositivo è la parte più importante ed è un preamplificatore del segnale del microfono a elettrete, la cui uscita è collegata al canale ADC0 dell'ADC integrato nel microcontrollore. Dobbiamo impostare il livello zero all'ingresso dell'ADC esattamente alla metà della tensione di riferimento, vale a dire 2,5 V. In questo caso, possiamo utilizzare la semionda positiva e negativa del segnale, ma la sua ampiezza non deve superare il limite stabilito, ad es. Il guadagno deve essere regolato con precisione per evitare il sovraccarico. Tutte le condizioni di cui sopra sono soddisfatte da un comune microcircuito amplificatore operazionale a bassa potenza.

L'algoritmo DFT è leggermente più lento rispetto alla trasformata veloce di Fourier. Ma il nostro analizzatore di spettro non richiede alta velocità e, se può fornire una velocità di aggiornamento di circa 30 fotogrammi al secondo, questo sarà più che sufficiente per visualizzare lo spettro di un segnale audio. In ogni caso, nella nostra versione è possibile raggiungere una velocità di 100 fotogrammi al secondo, ma questo è già un valore di parametro troppo alto per un indicatore LCD a caratteri a due righe e non è consigliato. La frequenza di campionamento è 20 kHz per una trasformata di Fourier discreta a 32 punti e poiché il risultato della trasformata è simmetrico, dobbiamo utilizzare solo la prima metà, cioè primi 16 risultati. Pertanto possiamo visualizzare lo spettro di frequenza fino a 10 kHz e la risoluzione dell'analizzatore è 10 kHz/16 = 625 Hz.

L'autore del progetto ha tentato di aumentare la velocità dei calcoli DFT. Se questa trasformazione ha N punti, allora dobbiamo trovare N2/2 valori di seno e coseno. Per la nostra trasformazione a 32 punti dobbiamo trovare 512 valori seno e coseno. Ma, prima di trovarli, dobbiamo calcolare l'angolo (gradi), cosa che richiederà un po' di tempo della CPU, quindi si è deciso di utilizzare tabelle di valori per questi calcoli. Quando si esegue il calcolo nel programma del microcontrollore, non vengono utilizzati numeri in virgola mobile e a doppia precisione, poiché l'elaborazione richiederà più tempo su un microcontrollore a 8 bit. Invece, i valori nelle tabelle di ricerca utilizzano dati interi a 16 bit moltiplicati per 10000. Quindi, dopo aver eseguito la conversione, i risultati vengono divisi per 10000. Con questo approccio, è possibile eseguire 120 conversioni a 32 punti per secondo, che è più che sufficiente per i nostri dispositivi.

Dimostrazione del funzionamento di un analizzatore di spettro su un microcontrollore ATmega32

Download

Codice sorgente (programma del microcontrollore, tabelle dati seno, coseno e angolo) -

  • È chiaro che su un AVR è difficile andare oltre la luce e la musica, i parametri non sono giusti. Ma 120 conversioni da 32 punti al secondo potrebbero essere sufficienti per la maggior parte delle attività. E puoi, ovviamente, prendere un altro campione di 625Hz, o meglio perdere la frequenza di aggiornamento. Vale la pena notare che l'MK si sentirà male; in termini di prestazioni, c'è poco altro che puoi attribuirgli. Ma qui puoi organizzare l'output del risultato utilizzando metodi di trasferimento dati hardware. Quindi sarà un microcontrollore ausiliario e quello principale riceverà solo dati da esso e li elaborerà in modo compatibile con altri processi. In generale, dipende ancora dalla frequenza del processore. Una volta era possibile overclockare il mega sopra i 20 MHz, ma per questi compiti probabilmente otterremo solo glitch alle alte frequenze. L'idea è buona, se solo venissero scritte più parti matematiche... è la sua implementazione su MK
  • Ho anche realizzato analizzatori più interessanti: You Tube o una versione su un LCD a colori: You Tube è basato sulla famosa libreria Chen :)
  • “dobbiamo calcolare l'angolo (gradi)” Qualcuno può dirci più in dettaglio come vengono calcolati i valori di queste tabelle?
  • Tutto è chiaro con la tabella dei seni e dei coseni. Non è chiaro come vengono calcolati i valori nella tabella Degree_lookup?

Tutti i segnali, sia che li abbiate inventati o che li abbiate osservati nell'Universo, sono in realtà solo la somma di semplici onde sinusoidali di frequenze diverse.

Ho realizzato un piccolo analizzatore di spettro audio (0 - 10 kHz) da un LCD 16x2 e un microcontrollore ATmega32. Ho iniziato con semplici DFT (trasformata discreta di Fourier). FFT (Fast Fourier Transform) differisce da DFT solo per una maggiore velocità e un algoritmo leggermente più complesso, non l'ho usato, forse lo aggiungerò più tardi.

La DFT è lenta rispetto alla FFT. Il mio analizzatore di spettro LCD non richiede l'alta velocità che la FFT può fornire e se l'immagine sullo schermo cambia a una velocità di circa 30 fotogrammi/sec, allora questo è più che sufficiente per visualizzare lo spettro audio. Ma riesco già a raggiungere circa 100 fps, tuttavia una frequenza di aggiornamento troppo alta non è consigliata per un LCD. L'audio campionato a 20 kHz produce 32 punti DFT. Poiché il risultato della trasformazione è simmetrico, devo utilizzare solo i primi 16 risultati. Di conseguenza, la frequenza massima è 10 kHz. Pertanto, 10kHz/16 = 625Hz.

Stavo cercando di aumentare la velocità del calcolo DFT. Se c'è un punto N DFT, dobbiamo trovare il seno e il coseno (N ^ 2) / 2. Per un DFT a 32 punti, dobbiamo trovare il seno e il coseno di 512. Prima di trovare il seno e il coseno, dobbiamo trovare l'angolo (gradi) che occupa un po' di tempo della CPU. Per fare questo, ho creato le tabelle per seno e coseno. Ho creato variabili seno e coseno a 16 bit moltiplicando i valori seno e coseno per 10000. Dopo la conversione, devo dividere ciascun risultato per 10000. Ora posso calcolare 120 DFT a 32 punti al secondo, che è più di abbastanza per un analizzatore di spettro.

Schermo

Ho utilizzato caratteri LCD personalizzati caricati nei 64 byte di memoria LCD integrata. Ho visto un video online in cui un LCD 16x2 viene utilizzato come display dell'analizzatore di spettro e ho utilizzato questa idea.

Ingresso audio

Una delle parti più importanti di un analizzatore di spettro è l'acquisizione del segnale da un microfono a elettrete. Particolare attenzione dovrebbe essere prestata allo sviluppo preamplificatore per microfono. Dobbiamo impostare il livello zero all'ingresso dell'ADC e il livello massimo pari alla metà della tensione di alimentazione, ovvero 2,5 V. Può essere alimentato con tensione da -2,5V a +2,5V. Il preamplificatore deve essere configurato in modo da non superare questi limiti. Ho usato un amplificatore operazionale LM324 come preamplificatore microfonico.

Elenco dei radioelementi

Designazione Tipo Denominazione Quantità NotaNegozioIl mio blocco note
Schermo
MK AVR 8 bit

ATmega32

1 Al blocco note
Condensatore22 pF2 Al blocco note
Condensatore0,1 µF1 Al blocco note
Condensatore elettrolitico100 µF1 Al blocco note
Resistore

100 ohm

1 Al blocco note
Resistenza trimmer4,7 kOhm1 Al blocco note
Risonatore al quarzo16 MHz1 Al blocco note
display LCD16×21 Al blocco note
alimentatore5 V1 Al blocco note
Ingresso audio
U1 Amplificatore operazionale

LM324

1 Al blocco note
C1 Condensatore1 µF1 Al blocco note
C8 Condensatore0,01 µF1 Al blocco note
R1 Resistore

220 kOhm

1 Al blocco note
R2, R3 Resistore

10 kOhm

2 Al blocco note
R4, R9 Resistore

1 kOhm

2 Al blocco note
R5 Resistore

Esistono molti processori specializzati per l'elaborazione del segnale digitale (DSP), come il DSP della serie TMS320 di Texas Instruments, che include sia semplici core interi che mostri come la sottofamiglia della famiglia C6000 che elabora dati in virgola mobile. Esiste un'intera serie ADSP di Analog Devices (che include il BlackFin più o meno universale), ce ne sono anche altri soluzioni semplici da MicroChip - dsPIC.

Comunque un DSP specializzato va bene, ma è sempre così necessario? Sì, con un enorme flusso di informazioni è semplicemente insostituibile, ma esistono anche attività di elaborazione più semplici. Nello specifico, mi interessava il compito della doppia conversione: il segnale audio viene convoluto, ottenendo così uno spettro, quindi è possibile eseguire qualsiasi operazione sullo spettro ed eseguire la conversione inversa, ottenendo così un segnale elaborato. Tutto ciò deve essere fatto in tempo reale e ottenere una qualità non inferiore a quella del telefono.

Questo non è l'anno 2000, ci sono soluzioni a chip singolo basate su core ARM7/Cortex-M3 ad alte prestazioni che sono diminuite notevolmente di prezzo; sono a 32 bit, hanno un'implementazione hardware di un'operazione di moltiplicazione a 32 bit (inoltre , quasi un'operazione di moltiplicazione-accumulo DSP e risultato a 64 bit), e Cortex-M3 include anche la divisione hardware.

Voglio avvertirti subito che l'elaborazione del segnale non è la mia specialità, quasi tutta la conoscenza (o meglio, la comprensione dei principi) è stata preservata dall'istituto, ma ora volevo solo testarla e implementarla. Ciò che intendo è che potrebbero esserci imprecisioni nella descrizione, sostituzione di concetti, ecc. In realtà, l’accuratezza accademica non mi preoccupava molto.

Per quasi tutti i DSP, il compito sopra descritto è semplice e diretto. Ma come si comporterà un core RISC per uso generale? Se consideriamo AVR o PIC, difficilmente saranno sufficienti. 8 bit e una frequenza di clock bassa hanno un effetto. Tuttavia, Elm-Chan ha dei progetti in cui conduce una FFT sull'AVR e disegna lo spettro del segnale. Tuttavia, in questo caso, in tempo reale, viene eseguita semplicemente la visualizzazione (con una precisione di elaborazione minima) e non l'elaborazione completa del segnale con una qualità audio accettabile.

Come chip sperimentale è stato scelto l'LPC2146, basato sul core ARM7TDMI-S e con una frequenza di clock massima di 60 MHz (in pratica non funziona a 72 e nemmeno a 84 MHz). Perché? In primo luogo, dispongo di una scheda di debug e, in secondo luogo, a bordo sono presenti un ADC e un DAC, ad es. è richiesto un rivestimento esterno minimo.

Una piccola teoria

Innanzitutto è stato interessante valutare le prestazioni della FFT (Fast Fourier Transform) su microcontrollori ARM. Sulla base di questa valutazione possiamo concludere se ha una velocità sufficiente per elaborare un flusso di dati audio e il segnale con quale frequenza di campionamento e quanti canali possono essere elaborati su un microcontrollore di questo tipo.

Basandosi sulla trasformata di Fourier, puoi costruire filtri intelligenti (con caratteristiche molto interessanti). Ero interessato principalmente ai problemi di cambiare il tono del segnale (alzare e abbassare lo spettro) e di "riflettere" lo spettro. Quest'ultimo è necessario nelle radio SDR per ascoltare le trasmissioni radiofoniche in banda laterale inferiore LSB.

Non ti caricherò di teoria e ti spiegherò cos'è la trasformata di Fourier; ci sono parecchi materiali su questo argomento, da quello che ho usato: una wiki e un capitolo di un libro molto buono e informativo.

Implementazione del software

Esistono molte implementazioni software della FFT, tuttavia, ho scritto la mia. L'obiettivo principale che ho perseguito è stato l'ottimizzazione del codice per un'architettura specifica. In primo luogo, mi sono subito concentrato su 32 bit, in secondo luogo, erano necessari solo calcoli di numeri interi ed era auspicabile evitare l'operazione di divisione. Trovare qualcosa di già pronto per soddisfare questi requisiti è già problematico.

Tutte le costanti che potevano essere calcolate in anticipo furono calcolate e inserite in tabelle (principalmente i valori delle funzioni trigonometriche). Questa è l'ottimizzazione principale dell'algoritmo, altrimenti ripete quasi completamente l'algoritmo descritto.

Il più importante è il requisito per i calcoli con numeri interi. Durante il processo di implementazione si è verificato addirittura un errore che ha causato un overflow in una delle variabili del loop a 32 bit. Inoltre, non appariva in tutti i dati dei test, quindi ha causato non pochi grattacapi finché non è stato trovato.

Ho raccolto tutti i testi originali in un unico archivio. L'implementazione non è definitiva, ci sono calcoli duplicati (spettro e simmetria di fase non vengono presi in considerazione) ed è necessaria l'ottimizzazione dell'uso dei buffer, poiché attualmente ne vengono utilizzati troppi per i calcoli memoria ad accesso casuale(quasi 12k per una conversione da 1024 punti).

Primi test

Rullo di tamburi: sto testando la velocità di conversione per un campione di 1024 punti, la frequenza del core del processore è di 60 MHz. Il test è stato effettuato in un emulatore, quindi non pretende di essere accurato al 100%, ma questo risultato può essere utilizzato come indicatore (nella mia esperienza precedente, anche se l'emulatore mentiva, non era molto). Test della prima versione del codice, compilatore RealView MDK, opzione di ottimizzazione O3, modalità di generazione del codice ARM.

Quindi cosa vediamo:

6ms per ogni conversione, per un totale di poco più di 12ms per la conversione andata e ritorno. Risulta che con una frequenza di campionamento di 44100 Hz (standard per l'audio) e campioni con una risoluzione fino a 16 bit, i calcoli puri richiederanno ~44*12 ms = 528 ms. E questo è su una versione intermedia del firmware, quando alcune ottimizzazioni del codice non sono ancora state completate (secondo le stime, l'algoritmo può essere accelerato di quasi 2 volte)! Secondo me è semplicemente un ottimo indicatore.

In totale, il carico principale dovrebbe essere intorno al 50%, un altro 50% rimane per le conversioni sullo spettro e i costi generali quando si lavora con ADC, DAC e altri trasferimenti di dati. Se si abbassa la frequenza di campionamento al livello “telefonico” (circa 4800-9600 Hz), il carico principale sarà ancora inferiore (circa 15-30%).

Quindi la parte matematica è più o meno chiara. Puoi procedere all'implementazione concreta.

Ferro

Per la piattaforma di test abbiamo utilizzato una scheda di sviluppo Keil MCB2140 con altoparlante. Un cavo Mini-Jack viene saldato per il collegamento all'uscita lineare del dispositivo e viene assemblata una semplice catena di ingresso. Come già accennato, la scheda è già dotata di un altoparlante collegato all'uscita analogica del microcontrollore e sono presenti i controlli (pulsante e potenziometro).

Ecco uno schizzo del circuito di ingresso:


Il debug del software è avvenuto in più fasi:

  1. Debug di tutte le periferiche necessarie: ADC, DAC, timer, indicazione LED.
  2. Test con digitalizzazione del segnale: digitalizzo i dati alla velocità richiesta e li metto in un buffer, poi estraggo i dati dal buffer e riproduco il segnale. Quelli. semplice spostamento del segnale nel tempo, senza alcuna trasformazione. In questa fase, viene testato il meccanismo per lavorare con 2 buffer, necessari per ulteriori lavori.
  3. A versione precedente vengono aggiunte le trasformate di Fourier diretta e inversa. Questo test verifica infine il corretto funzionamento del codice FFT, oltre a controllare che il codice rientri nelle prestazioni disponibili.
  4. Dopo aver completato lo scheletro principale dell'applicazione, è possibile passare alle applicazioni pratiche.

Il problema è sorto dopo l'aggiunta della FFT al codice: nel segnale apparivano rumori e fischi estranei. In generale, questo comportamento mi è sembrato piuttosto strano, perché... Senza conversione, il segnale che passa attraverso il percorso digitale è rimasto abbastanza pulito. Il primo motivo: dopo il circuito analogico, l'ampiezza del segnale sull'ADC non era completa (0-3,3 V), ma solo entro 0,5-2 V al volume massimo del lettore, il secondo: rumore piuttosto forte dovuto a numeri interi calcoli (+-1 unità, che si è rivelata sufficiente a provocare un'interferenza udibile).

Per combattere il primo problema, si è deciso di iniziare a regolare la parte analogica. E per risolvere il problema del rumore, prova a utilizzare un filtro passa-basso.

Applicazione 1: modifica del tono del segnale

La scheda è dotata di un potenziometro ( resistore variabile), può essere utilizzato per il controllo. In questo caso, imposta lo spettro del segnale in modo che si sposti su e giù, abbastanza da “trasformare” le tue composizioni preferite.

Ecco cosa succede nel dominio della frequenza:


In questo caso, il risultato della conversione è contenuto in 2 buffer. Un buffer è la parte reale e l'altro è la parte immaginaria. Il significato fisico dei numeri in essi ottenuti: la parte reale contiene i valori delle armoniche, la parte immaginaria contiene lo sfasamento per queste armoniche. Inoltre, come puoi vedere, il segnale iniziale è descritto da N valori e dopo la conversione si ottengono 2 N valori. La quantità di informazioni non cambia e l'aumento di 2 volte della quantità di informazioni si verifica a causa del fatto che i dati del buffer presentano ridondanza sotto forma di duplicazione di valori.




Superiore