PDA

View Full Version : Elaborazione tramite FFT


Wotan
11-09-2007, 11:27
Devo fare l'elaborazione di un segnale audio in formato WAV tramite FFT.
Il segnale è un tono sinusoidale acquisito da un generatore di segnali tramite la scheda audio del mio pc. L'obiettivo è quello di verificare la rumorosità introdotta dalla scheda.
Poichè non conosco il passo di quantizzazione del DAC nè altre informazioni sulle caratteristiche della scheda dovrei estrapolare più dati possibili dal segnale acquisito.
Per elaborare il file WAV devo usare MATLAB.
Sono riuscito a graficare il modulo quadro della trasformata di Fourier, ma non ho idea dell'unità di misura che mi viene graficata... :rolleyes:
Io ho applicato in ingresso alla scheda un segnale a circa 10kHz e ampiezza picco-picco di 0.5 Volt (sperando di non aver fritto nulla visto che non avevo idea del range di ingresso... :stordita: )
Mi è stato detto di effettuare una normalizzazione rispetto al picco massimo, ma non ho capito di cosa si tratti :fagiano:
Qualcuno è in grado di darmi delucidazioni in merito oppure di consigliarmi qualche altro tipo di elaborazione?
Se servono altre informazioni chiedete pure... cercherò di rispondervi.
Vi ringrazio in anticipo

BYEZ =D

bjt2
11-09-2007, 18:20
+-0.5 Volt dovrebbe andare. Visualizza la forma d'onda. Se è squadrata allora hai esagerato. Da mie meorie il massimo dovrebbe essere 2V picco - picco (+- 1V).

Il passo di quantizzazione dovrebbe essere 44100, ma in ogni caso se leggi il file direttamente in matlab puoi digitare:

[Y,FS,Nbits]=wavread('nomefile.wav');

Y contiene i dati (se è stereo è un vettore 2xN), FS è la frequenza di campionamento in Hertz e Nbits è il numero di bits del file wav. Y è sempre in formato floating point con minimo e massimo tra -1 e +1 ...

L'unità di misura della frequenza della FFT è la frequenza normalizzata: la frequenza 0 è 0 Hz e la frequenza 1 è la metà della frequenza di campionamento, cioè FS/2

Spero di esserti stato utile. :)

Wotan
11-09-2007, 18:28
La forma d'onda è corretta: una sinusoide corrotta da rumore.
44100 è la frequenza di campionamento, il passo di quantizzazione che intendevo io era quello relativo alla caratteristica del DAC della scheda, ma purtroppo non sono riuscito a trovare nessun dato tecnico a riguardo :muro:
La funzione wavread la conosco ed è quella che ho utilizzato per leggere il file ;)
Quello che hai detto riguardo alle frequenze normalizzate credo sia relativo alle frequenza digitali, giusto?
Però forse mi sono espresso male, io intendevo che mi era stato detto di normalizzare l'ampiezza della FFT (anche se in realtà graficando poi lo spettro di densità di potenza in dB quello che ottengo è solo una traslazione in alto o in basso del grafico... quindi non vedo una grossa utilità in questa normalizzazione :stordita: )
Comunque grazie per l'aiuto :)
Altri suggerimenti?

BYEZ =D

bjt2
12-09-2007, 06:35
La forma d'onda è corretta: una sinusoide corrotta da rumore.
44100 è la frequenza di campionamento, il passo di quantizzazione che intendevo io era quello relativo alla caratteristica del DAC della scheda, ma purtroppo non sono riuscito a trovare nessun dato tecnico a riguardo :muro:
La funzione wavread la conosco ed è quella che ho utilizzato per leggere il file ;)
Quello che hai detto riguardo alle frequenze normalizzate credo sia relativo alle frequenza digitali, giusto?
Però forse mi sono espresso male, io intendevo che mi era stato detto di normalizzare l'ampiezza della FFT (anche se in realtà graficando poi lo spettro di densità di potenza in dB quello che ottengo è solo una traslazione in alto o in basso del grafico... quindi non vedo una grossa utilità in questa normalizzazione :stordita: )
Comunque grazie per l'aiuto :)
Altri suggerimenti?

BYEZ =D

Beh, qualunque sia il DAC della scheda, quella è la precisione massima. Quella utilizzata per la tua acquisizione è quella che ti restituisce wavread... ;) Se vuoi altre precisioni devi usare un software che le supporta (per dire: il registratore di suoni di windows supporta max 44100 a 16 bit... Anche se la scheda dovesse fare di più). Inoltre per leggere files wav oltre 16 bit e 44100 Hz, devi avere almeno Matlab 6.5 (che legge files con un numero qualsiasi di canali, qualsiasi passo di quantizzazione e precisione fino a 32 bit interi o floating point per sample). Per vedere la precisione della scheda dovresti usare un programma più professionale. Su internet se ne trovano tanti. Comunque se la scheda non è vecchia o è il codec di qualche scheda madre recente, supporta almeno 24 bit e 48KHz... ;) Se quello che devi fare è un esercizio per la scuola, comunque, va benissimo anche 44100 Hz, 16 bit... ;)

Quelle che tu hai chiamato frequenze digitali, mi pare si chiamino anche frequenze digitali... Non ricordo... Mi sono laureato 6 anni fa... :D

In effetti la normalizzazione non ha molto senso... :mbe: Ma cosa devi fare di preciso? Un esercizio di scuola? Un progetto più complicato? Che software hai usato? Che scheda audio hai? Che versione di Matlab hai? Sai... Io con Matlab ci lavoro... Ci scrivo continuamente software, per lo più di elaborazioni di immagini (mediche e tridimensionali: TAC, risonanze), la FFT la uso spessissimo...

Wotan
12-09-2007, 07:49
Si tratta di un progetto per l'università.
Dovevo scrivere un programma in C per acquisire un segnale tramite la scheda audio e successivamente elaborarlo con Matlab per vedere il rumore introdotto dalla scheda.
Il passo di quantizzazione del DAC della scheda mi serviva per calcolare il rumore di quantizzazione. Inoltre mi sarebbe potuto servire il guadagno del DAC per capire il legame tra il segnale di ingresso e quello acquisito (in ingresso la sinusoide era 0.5 Vpp, quella acquisita invece è circa 1.6 Vpp)... potrei fare più prove e estrapolare il guadagno, ma mi pare un lavoro inutile.
Relativamente alla frequenza di campionamenteo e alla risoluzione ho impostato 44100 Hz e 16 bit con il mio programma, ma non era molto importante.
La scheda audio purtroppo è quella integrata nel mio portatile (Acer Aspire 1524WLMI - è una scheda della VIA, ma non ho trovato i dati tecnici che mi servivano).
Uso la versione 7.3 di Matlab.

BYEZ =D

bjt2
12-09-2007, 09:14
Si tratta di un progetto per l'università.
Dovevo scrivere un programma in C per acquisire un segnale tramite la scheda audio e successivamente elaborarlo con Matlab per vedere il rumore introdotto dalla scheda.
Il passo di quantizzazione del DAC della scheda mi serviva per calcolare il rumore di quantizzazione. Inoltre mi sarebbe potuto servire il guadagno del DAC per capire il legame tra il segnale di ingresso e quello acquisito (in ingresso la sinusoide era 0.5 Vpp, quella acquisita invece è circa 1.6 Vpp)... potrei fare più prove e estrapolare il guadagno, ma mi pare un lavoro inutile.
Relativamente alla frequenza di campionamenteo e alla risoluzione ho impostato 44100 Hz e 16 bit con il mio programma, ma non era molto importante.
La scheda audio purtroppo è quella integrata nel mio portatile (Acer Aspire 1524WLMI - è una scheda della VIA, ma non ho trovato i dati tecnici che mi servivano).
Uso la versione 7.3 di Matlab.

BYEZ =D

Oh... Ora è più chiaro... :D
Dunque... Il rumore introdotto dalla scheda si può assumere bianco. Anche quello di quantizzazione, se il numero di bit è superiore a 2 ( :D ) si può assumere bianco. Quindi calcolata la potenza del rumore, basta che sottrai quadraticamente la potenza del rumore di quantizzazione. Vediamo allora come fare:

Se tu hai acquisito a 44100 Hz e 16 bit e non hai scalato il segnale in alcun modo, allora l'errore medio di quantizzazione, dato che Matlab riscala -32768 : +32767 all'intervallo -1 : +1 è 1/65536. (questo perchè ogni guadagno della scheda audio è in analogico e comunque prima della quantizzazione. Però il rumore che otterremo è quello della tua scheda audio con quel guadagno... Magari puoi usare il guadagno massimo, in modo da calcolare il rumore massimo...). Quindi la potenza dovrebbe essere quella di un rumore uniforme con media 1/65536, che varia da 0 a 1/32768 (sorry, la formula non la ricordo...) Quindi chiamiamo la potenza di questo rumore Pq. Ora la potenza del rumore della scheda audio. Visto che lo scopo è misurare quello, sarebbe bastato campionare solo il rumore. Mi sfugge il motivo di campionare un'onda sinusoidale... :mbe: Comunque, una volta stimato il valore massimo della sinusoide, puoi calcolare la potenza della stessa (occhio ad essere preciso, perchè altrimenti l'errore che commetti dopo è alto...). Sia Ps tale potenza (dovrebbe essere il valore RMS, che mi pare sia 1/2 Vmax ^2 , dove Vmax = 1/2 Vpp ). Ora devi calcolare la potenza totale Ptot, integrando la FFT (non ricordo la formula, sorry)... Sia Pscheda il valore che ti serve.

Si avrà: Ptot=Pscheda+Ps+Pq ... Da cui ricavi Pscheda... ;)