Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50

    [c] filtraggio_suoni

    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:
    codice:
    #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?
    codice:
    code

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Ma intendi la somma in ampiezza? Il filtro nn si capisce bene cs vuoi dire, presumo un FIR da 10 punti?
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50
    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...
    codice:
    code

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Allora ho trovato questo pezzo di codice, in BASIC, utilizzato per testare un sinc filter

    codice:
    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
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50
    codice:
    #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("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??
    codice:
    code

  6. #6
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    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
    Per gli Spartani e Sparta usa spartan Il mio github

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50
    durissima, io non sono nemmeno pratico di segnali audio , quindi devo creare una funzione di filtro fir passa banda solamente ?
    codice:
    code

  8. #8
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    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

    codice:
    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.
    Per gli Spartani e Sparta usa spartan Il mio github

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    50
    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

    codice:
    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
    codice:
    code

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.