Pagina 1 di 1

[C] Filtraggio suoni con dati memorizzati in array

Inviato: 10 feb 2011, 11:42
da asteroid
SALVE,
sto affrontando un problema di codifica in C, di un filtro dei segnali audio
Ho due array x, e y di dimensioni 1xn contente le informazioni relative a due file sonori. Devo Implementare una funzione che permette la mistura dei due segnali secondo la seguente relazione: z[ i ]=A[0]x[ i ]+A[1]y[ i ]
dove A è un array di dimensioni 1x2 i cui valori di amplificazione sono compresi nell intervallo [0,1], e sono inseriti dall utente.
Successivamente implementare il seguente filtraggio della mistura z[ i ] in modo da ottenere un nuovo suono filtrato y[ i ]=sommatoria di k=0; che va a k=9; C[k]z[i+k].....dove C è un vettore di coefficienti inseriti dall utente e di dimensione 10. Si noti che per ottenere il filtraggio bisogna aggiungere degli zero alla fine della sequenza z[ i ].
I suoni vengono inizializzati casualmente con valori float nell intervallo [-10,10] e i coefficienti vengono inseriti dall utente.

ho implementato il seguente codice dove ho dichiarato ed inizializzato gli elementi:

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{int i,k;
  float x[20];
  float y[20];
  float A[2]={0.1F,0.5F}; /*valori di amplificazione*/
  float C[10]={1.0F,1.1F,2.2F,2.3F,2.6F,4.1F,4.5F,5.2F,5.3F,5.4F}; /*vettore coefficienti*/
  float z[100];
  float x_casuale;
  float y_casuale;
srand(time(NULL));
  for(i=0; i<20;i++){
           x_casuale=-10.0F+20.0F*(float)rand()/(float)RAND_MAX;
           x[i]=x_casuale;
   printf("\nvisualizza %d-esimo di x:%f\n",i,x[i]);

}
printf("\n\n\n\n");
for(i=0; i<20;i++){
           y_casuale=-10.0F+20.0F*(float)rand()/(float)RAND_MAX;
           y[i]=y_casuale;
   printf("\nvisualizza %d-esimo di y:%f\n",i,y[i]);
}
system ("color 2");
  system("PAUSE");   
  return 0;
}


il problema che mi persuade è come faccio a fare la mistura secondo z [ i ]=A[0]x[ i ]+A[1]y[ i ] :?:

Re: [C] Filtraggio suoni con dati memorizzati in array

Inviato: 10 feb 2011, 13:49
da xyz
asteroid ha scritto:il problema che mi persuade è come faccio a fare la mistura secondo z [ i ]=A[0]x[ i ]+A[1]y[ i ] :?:

Non riesci a implementare la funzione che hai scritto ? E' di una banalità:

Codice: Seleziona tutto

for(i=0; i<20;i++){
  z[i]=A[0]*x[i]+A[1]*y[i];
}

almeno da quello che ho capito dopo la lunghissima premessa.

Di solito all'inizio per realizzare questi tipi di software si utilizzano dei programmi più adatti come Matlab, Scilab, Ocatve, ecc... una volta finito il codice si riscrive se serve in C.

Re: [C] Filtraggio suoni con dati memorizzati in array

Inviato: 10 feb 2011, 15:14
da asteroid
no così, sarebbe stato banale,
cioè io non capisco fare una "mistura" con la seguente funzione z[ i ]=A[0]x[ i ]+A[1]y[ i ](che gercalmente significa miscuglio) tra 2 file sonori che in questo caso sono x, e y...
cioè scavando sul web e trovando alcune informazioni dovrei fare un filtro equalizzazione e somma
ed in seguito un filtro FIR...

Re: [C] Filtraggio suoni con dati memorizzati in array

Inviato: 10 feb 2011, 17:59
da xyz
Questi dettagli sono stati omessi prima o non si capivano.

Equalizzare dei segnali per poi essere sommati, applicare un successivo filtro FIR entrano in gioco molte cose di teoria dei segnali. Di solito uno dovrebbe conoscere molto bene la teoria dei segnali discreti prima di mettersi a scrivere un software di questo tipo.

La formula che hai indicato è una combinazione lineare di due segnali discreti. Per me sarebbe un mixer (io uso questo termine, mistura non mi piace), se fosse A[1] = 1-A[0], io la conosco sotto questa forma z[n] = t*x[n] + (t-1)*y[n], dove t varia tra 1 (solo segnale x[n]) a 0 (solo segnale y[n]).

Se vuoi fare un filtro equalizzatore nel dominio del tempo discreto la trattazione è più complessa e bisogna sapere cosa si deve ridurre, consiglio di studiare qualche buon libro sui segnali a tempo discreti e/o DSP.

Re: [C] Filtraggio suoni con dati memorizzati in array

Inviato: 10 feb 2011, 19:56
da asteroid
Edit TF: eliminato quoting inutile.

Essendo io un ragazzino del I anno di uni, non sono pratico di segnali audio, ma solo di linguaggio di programmazione C;
comunque proverò a codificare qualcosina in C; se potrai darmi anche ulteriori informazioni su convoluzione e filtro FIR, mi sarebbe d'aiuto; =P~

Re: [C] Filtraggio suoni con dati memorizzati in array

Inviato: 10 feb 2011, 21:19
da xyz
Esistono molti libri sull'argomento, corsi universitari, non sono cose che si riescono a spiegare in poche righe.

Una partenza è la trasformata Z ma non è facile capirla senza delle buoni basi matematiche:

http://en.wikipedia.org/wiki/Z_transform

Anche la convoluzione discreta non è facile, è utilizzata in molti campi, ad esempio per filtrare dei segnali:

http://en.wikipedia.org/wiki/Convolutio ... onvolution

I filtri FIR sono del filtri discreti non ricorsi, intrinsecante stabili:

http://en.wikipedia.org/wiki/Finite_impulse_response

Re: [C] Filtraggio suoni con dati memorizzati in array

Inviato: 11 feb 2011, 0:51
da IsidoroKZ
C'e` un libro scaricabile gratuitamente da internet che spiega tutte queste cose, e anche molte altre!