PDA

Visualizza la versione completa : [C] Filtraggio suoni con dati memorizzati in array


asteroid
07-02-2011, 18:25
SALVE developers;
Siano dati due array monodimensionali x ed y di dimensione 1xn contenente le
informazioni relative a due file sonori. Implementare una funzione che permette di
ottenere la mistura dei due segnali secondo la seguente relazione:
z = A[0]x + A[1]y
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 in modo da
ottenere una nuovo suono filtrato y =è una sommatoria che va da k=0 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 suoni vengono inizializzati casualmente con valori float nell’intervallo [-10, 10]
e i coefficienti vengono inseriti dall’utente.

ho iniziato a dichiarare gli elementi ed inizializzarli:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{int i,n,k;
float x[100];
float y[100];
float A[][2]={2.5F,3.1F};
float C[10];
float z[100];
printf("inserisci il size delle informazioni dei file sonori:");
scanf("%d",&n);
printf("inserisci le informazioni relative al file sonoro x:\n");
for(i=0; i<n; i++)
scanf("%f",&x[i]);
printf("inserisci le informazioni relative al file sonoro y:\n");
for(i=0; i<n; i++)
scanf("%f",&y[i]);
system("PAUSE");
return 0;
}

ora dovrei fare una mistura: cioè un miscuglio degli elementi dell array A con l'array x e y, quindi questi ultimi due devono essere dei numeri float giusto?
poi successivamente dovrei creare un vettore C che deve contenere dei "coefficienti", cioè vale a dire sempre dei numeri float? ;)

linoma
07-02-2011, 20:51
Ma intendi la somma in ampiezza? Il filtro nn si capisce bene cs vuoi dire, presumo un FIR da 10 punti?

asteroid
08-02-2011, 00:00
cosa intendi creare un filtro?
cioè un filtro FIR?

in pratica si, devo costruire un filtro di equalizzazione e somma
seguito da un filtro FIR...

linoma
08-02-2011, 07:23
Allora ho trovato questo pezzo di codice, in BASIC, utilizzato per testare un sinc filter



400 FOR J% = 100 TO 4999 'Convolve the input signal & filter kernel
410 Y[J%] = 0
420 FOR I% = 0 TO 100
430 Y[J%] = Y[J%] + X[J%-I%] * H[I%]
440 NEXT I%
450 NEXT J%
460 '


per il resta mi tocca ricercare tutti i miei appunti :)

asteroid
08-02-2011, 12:55
#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.4 F}; /*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("PAUSE");
return 0;
}

ho modificato i valori di x ed y, in quanto devono essere valori float casuali nell'intervallo[-10,10]
ora per fare la mistura secondo la relazione z[i]=A[0]x[i]+A[1]y[i] devo prendere ogni campione contenuto nei due file audio viene moltiplicato per il suo coefficienti e sommato all'altro, giusto?? :confused:

linoma
08-02-2011, 20:49
L'esempio che ti ho riportato ti mostra 2 cicli for il primo scorre i campioni audio ed il secondo scorre i punti del fir. Considera che il nuovo campione e dato dalla sommatoria dei campioni per il filtro. Detto in parole povere se non devi variare l'ampiezza per una determinata banda puoi semplicemente moltiplicare i tuoi campioni per un determinato indice di variazione. Cmq la vedo dura per il tuo FIR passa banda :)

asteroid
09-02-2011, 18:16
durissima, io non sono nemmeno pratico di segnali audio :cry: , quindi devo creare una funzione di filtro fir passa banda solamente ? :(

linoma
09-02-2011, 18:50
Mi pare di capire che il tuo unico problema sia la convoluzione cioe filtrare il segnale audio, le poche righe di codice in basic fanno quello. Te le posto in c



for(int j = 100;j <= 4999;j++){
y[j] = 0;
for(int i = 0;i<=100;i++)
y[j] += x[j-i] * h[i];
}


dove x il tuo segnale in ingresso y il segnale risultante ed h il kernel del tuo filtro. E mi pare abbiano tutti abbiano 10 elementi nel tuo esempio.
Ho scritto in questo modo del filtro xche se hai modo di vedere la risposta in frequenza del FIR ti renderai conto che pecca di alcuni problemi in determinati casi, cs che a te nn interessa.

asteroid
10-02-2011, 11:49
Originariamente inviato da linoma
Mi pare di capire che il tuo unico problema sia la convoluzione cioe filtrare il segnale audio, le poche righe di codice in basic fanno quello. Te le posto in c



for(int j = 100;j <= 4999;j++){
y[j] = 0;
for(int i = 0;i<=100;i++)
y[j] += x[j-i] * h[i];
}


dove x il tuo segnale in ingresso y il segnale risultante ed h il kernel del tuo filtro. E mi pare abbiano tutti abbiano 10 elementi nel tuo esempio.
Ho scritto in questo modo del filtro xche se hai modo di vedere la risposta in frequenza del FIR ti renderai conto che pecca di alcuni problemi in determinati casi, cs che a te nn interessa.
questo codice che hai scritto fa questo
la convoluzione : Y(kT) = C(n)*Z(kT)
Y(0) = C(0)*Z(0) = 0.1
Y(1) = C(0)*Z(1) + C(1)*Z(0) = 0.2+0
Y(2) = C(0)*Z(2)+C(1)*Z(1)+C(2)*Z(0) = 0.3+0-0.1 = 0.2
Y(3) = C(0)*Z(3)+C(1)*Z(2)+C(2)*Z(1)+C(3)*Z(0) = 0.4+0-0.3+0+0.1 = 0.2
e cosi via
con dei numeri di esempio a caso

ma io per prima cosa devo ottenere la mistura z[ i ] prima di fare il filtraggio Fir :shy:

Loading