eigenfisting
Would you like to react to this message? Create an account in a few clicks or log in to continue.

eigenfisting

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

Filtrare la voce da un file musicale

View previous topic View next topic Go down
Author Message
seitan666

seitan666


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

Filtrare la voce da un file musicale Vide
PostSubject: Filtrare la voce da un file musicale Filtrare la voce da un file musicale I_icon_minitimeMon 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
PsycoYack

PsycoYack


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

Filtrare la voce da un file musicale Vide
PostSubject: Re: Filtrare la voce da un file musicale Filtrare la voce da un file musicale I_icon_minitimeMon 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
seitan666

seitan666


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

Filtrare la voce da un file musicale Vide
PostSubject: Re: Filtrare la voce da un file musicale Filtrare la voce da un file musicale I_icon_minitimeMon 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
Stee_

Stee_


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

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

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

PsycoYack


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

Filtrare la voce da un file musicale Vide
PostSubject: Re: Filtrare la voce da un file musicale Filtrare la voce da un file musicale I_icon_minitimeTue 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
PsycoYack

PsycoYack


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

Filtrare la voce da un file musicale Vide
PostSubject: Re: Filtrare la voce da un file musicale Filtrare la voce da un file musicale I_icon_minitimeWed 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
Filtrare la voce da un file musicale Prova0nf3
Filtrare la voce da un file musicale Prova1bq2

- mia sorella (notare che la distribuzione è concentrata a frequenze più alte, come è giusto che sia)
Filtrare la voce da un file musicale Prova2ad7

- io che faccio acuti e suoni strani, risultato assai buffo
Filtrare la voce da un file musicale Prova3pz9

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
seitan666

seitan666


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

Filtrare la voce da un file musicale Vide
PostSubject: Re: Filtrare la voce da un file musicale Filtrare la voce da un file musicale I_icon_minitimeFri 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
PsycoYack

PsycoYack


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

Filtrare la voce da un file musicale Vide
PostSubject: Re: Filtrare la voce da un file musicale Filtrare la voce da un file musicale I_icon_minitimeFri 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
Sponsored content





Filtrare la voce da un file musicale Vide
PostSubject: Re: Filtrare la voce da un file musicale Filtrare la voce da un file musicale I_icon_minitime

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 | Report an abuse | Forumotion.com