eigenfisting

Per parlare di università, politica, attualità e .. dai non diciam cazzate, solo fisting e foto del giusto che dorme..
 
HomeCalendarFAQSearchMemberlistUsergroupsRegisterLog in

Filtrare la voce da un file musicale

View previous topic View next topic Go down
Author Message
seitan666

avatar


Age : Join date : 2008-11-26 Posts : 203 Location :

PostSubject: Filtrare la voce da un file musicale Mon Dec 01, 2008 11:23 pm

Vediamo se c'è qualche geek/nerd che può aiutarmi in questo dilemma più o meno irrisolvibile...
NOTA: invertire uno dei due canali e convertire la traccia in mono non è un metodo valido... anzi fa caccare...
Back to top Go down
View user profile
PsycoYack

avatar


Age : Join date : 2008-11-26 Posts : 267 Location :

PostSubject: Re: Filtrare la voce da un file musicale Mon Dec 01, 2008 11:37 pm

io te l'ho detto, se tu sapessi approssimativamente la frequenza delle amoniche che compongono la voce umana potresti, in linea teorica, estrarre la voce umana dalla canzone applicando una trasformata discreta di fourier ed eliminando le frequenze non richieste.
il problema è che da persona a persona queste frequenze variano in maniera assurda, quindi hai le mani legate.
Back to top Go down
View user profile
seitan666

avatar


Age : Join date : 2008-11-26 Posts : 203 Location :

PostSubject: Re: Filtrare la voce da un file musicale Mon Dec 01, 2008 11:42 pm

eh... ci ho provato con millemila filtri passa banda, diciassei passa basso e ventordici passa alto... ma niente di utile...
Back to top Go down
View user profile
Stee_

avatar


Age : 30 Join date : 2008-12-01 Posts : 134 Location :

PostSubject: Re: Filtrare la voce da un file musicale Mon Dec 01, 2008 11:42 pm

Chiedeteglielo al monti...o a metalingargiola
Back to top Go down
View user profile
PsycoYack

avatar


Age : Join date : 2008-11-26 Posts : 267 Location :

PostSubject: Re: Filtrare la voce da un file musicale Tue Dec 02, 2008 12:05 am

seitan666 wrote:
eh... ci ho provato con millemila filtri passa banda, diciassei passa basso e ventordici passa alto... ma niente di utile...
io ho implicitamente detto che dovresti fare un passabanda multiplo. dovresti registrare la tua voce, scomporla e fare un'indagine statistica sulle frequenze dominanti.
buona fortuna Very Happy
Back to top Go down
View user profile
PsycoYack

avatar


Age : Join date : 2008-11-26 Posts : 267 Location :

PostSubject: Re: Filtrare la voce da un file musicale Wed Dec 03, 2008 1:23 am

mi hai fatto venir voglia di investigare questo problema, allora tanto per perdere un'oretta ho deciso di scrivere qualche riga di codice.
il programma disegna tramite gnuplot la media del modulo delle componenti frequenziali di un file audio (tante tante assunzioni: wav, 16 bit, little endian, 44100hz, etc...) prendendo progressivamente blocchi di 44100 campioni, applicando la trasformata discreta di fourier e facendo la media (volevo disegnare anche la varianza, per ovvi motivi, ma non avevo sbatta, magari in futuro).
beh, fa grafici buffi, sono interessanti da vedere.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <fftw3.h>
#include <math.h>

#define BLOCK_SIZE 44100
#define abs(n) sqrt((n)[0]*(n)[0]+(n)[1]*(n)[1])

typedef signed short int16;

const char *temp_dat = "temp.dat";
const char *title0 = "E[|X(f)|]";
const char *title1 = "E[|X(f)|]dB";
const char *gnuplot =
   "set terminal png notransparent enhanced size 640,480\n"
   "set output \"%s\"\n"
   "%s set logscale x\n"
   "plot \"%s\" ti \"%s\" with lines\n";
const char *help =
   "%s input output [x_axis y_axis]\n"
   "\tinput\t\twav input\n"
   "\toutput\t\tpng output\n"
   "\tx_axis\t\t0 -> f; 1 -> log(f)\n"
   "\ty_axis\t\t0 -> E[|X(f))|]; 1 -> E[|X(f)|]dB\n";

int main(int argc, char **argv) {
   FILE *fp;
   int read, i, n = 0, x_axis = 0, y_axis = 0;
   fftw_complex *input, *transform;
   fftw_plan p;
   int16 audio_data[BLOCK_SIZE];
   float abs_sum[BLOCK_SIZE];
   
   if(argc < 3) {
      printf(help, argv[0]);
      return -1;
   }
   if(argc >= 4)
      x_axis = atoi(argv[3]);
   if(argc >= 5)
      y_axis = atoi(argv[4]);
   
   fp = fopen(argv[1], "rb");
   fseek(fp, 44, SEEK_SET);
   
   input = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * BLOCK_SIZE);
   transform = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * BLOCK_SIZE);
   
   for(i = 0; i < BLOCK_SIZE; i++) {
      abs_sum[i] = 0;
   }
   
   read = fread(audio_data, sizeof(int16), BLOCK_SIZE, fp);
   while(read == BLOCK_SIZE) {
      for(i = 0; i < BLOCK_SIZE; i++) {
         input[i][0] = audio_data[i];
         input[i][1] = 0;
      }
      p = fftw_plan_dft_1d(BLOCK_SIZE, input, transform, FFTW_FORWARD, FFTW_ESTIMATE);
      fftw_execute(p);
      for(i = 20; i < 20000 /*BLOCK_SIZE*/; i++) {
         abs_sum[i] += abs(transform[i]);
      }
      fftw_destroy_plan(p);
      read = fread(audio_data, sizeof(int16), BLOCK_SIZE, fp);
      n++;
   }
   fftw_free(input);
   fftw_free(transform);
   fclose(fp);
   
   fp = fopen(temp_dat, "w");
   for(i = 20; i < 20000/*BLOCK_SIZE*/; i++) {
      abs_sum[i] /= n;
      fprintf(fp, "%d %.5f\n", i, y_axis ? 20*log10(abs_sum[i]) : abs_sum[i]);
   }
   fclose(fp);
   
   fp = popen("gnuplot", "w");
   fprintf(fp, gnuplot, argv[2], x_axis ? "" : "#", temp_dat, y_axis ? title1 : title0);
   pclose(fp);
   
   remove(temp_dat);
   
   return 0;
}
alcuni esempi:
- due prove standard con la mia voce



- mia sorella (notare che la distribuzione è concentrata a frequenze più alte, come è giusto che sia)


- io che faccio acuti e suoni strani, risultato assai buffo


beh, non hai minimamente risolto il tuo problema... però ora puoi divertirti a guardare tanti bei grafici, loal.
comunque, tendenzialmente pare che le frequenze mediobasse abbiano contributo maggiore (i grafici sono in decibel, quindi effettivamente contribuiscono molto di più), quindi nel tentativo di estrarre la voce potresti moltiplicare la trasformata per una funzione che attenua progressivamente frequenze più alte (non un filtro passabanda ideale perchè taglierebbe nettamente frequenze più elevate) e sperare che venga qualcosa di udibile Very Happy
Back to top Go down
View user profile
seitan666

avatar


Age : Join date : 2008-11-26 Posts : 203 Location :

PostSubject: Re: Filtrare la voce da un file musicale Fri Dec 05, 2008 9:49 pm

allora.. ho letto un po' di roba oggi.. in particolare, mi sembra carino questo: Singer Identification in Popular Music Recordings
Using Voice Coding Features (che è poi quello che diceva Snagg.. in alternativa

  • AUTOMATIC SINGER IDENTIFICATION
  • Robust speaker recognition: a feature-based approach
  • CONSTRUCTION AND EVALUATION OF A ROBUSTMULTIFEATURE SPEECH/MUSIC
    DISCRIMINATOR
  • LOCATING SINGING VOICE SEGMENTS WITHIN MUSIC SIGNALS


Da questi la cosa più facilmente fattibile, mi sembra:

  • filtro passabanda come in seconda pagina del primo documento (non saprei come farne uno di chebyshev, ma penso che vada bene uno simile)..
  • Il discorso dell'armonicità: individuare le frequenze dominanti e trovarne i multipli

Detto così sembra quasi semplice... ma bisogna ragionarci sopra un po'... se qualcun'altro ha sbattimenti di provarci (vedi Yack quà sopra)... fate pure...
Back to top Go down
View user profile
PsycoYack

avatar


Age : Join date : 2008-11-26 Posts : 267 Location :

PostSubject: Re: Filtrare la voce da un file musicale Fri Dec 05, 2008 10:40 pm

beh, la roba del filtro passabanda attenuato era quello che avevo (correttamente) previsto, però considera che è una cosa estremamente grezza, ed essendo la trasformata di fourirer lineare la trasformata della somma di due segnali è la somma delle trasformate, quindi tecnicamente se due segnali contribuiscono a frequenze equivalenti non hai modo di tornare ai valori originali, ma solo di filtrarlo un pochettino e sperare Very Happy
per il resto non ho sinceramente guardato, magari mi leggo qualcosina se non ho niente da fare lunedì, poi vediamo...
Back to top Go down
View user profile
Sponsored content





PostSubject: Re: Filtrare la voce da un file musicale

Back to top Go down

Filtrare la voce da un file musicale

View previous topic View next topic Back to top
Page 1 of 1

Permissions in this forum: You cannot reply to topics in this forum
eigenfisting :: VARIE :: PROGRAMMAZIONE -
Free forum | © phpBB | Free forum support | Contact | Report an abuse | Forumotion.com