Newsgroup: it.comp.lang.c
Titolo: ...estrazione parte comune di un file stereo

qualcuno riesce?
ho un file stereofonico, dovrei estrarre la parte comune ai  due
canali L R
ed infine ottenere LCR
Detta A la componente comune ai canali L R di un segnale stereofonico
 B e C le componenti presenti solo a sx e dx
 ovvero: L=A+B ed R=A+C i contenuti dei 2 ch.
Per rimuovere la parte comune si deve differenziare L ed R,
se A è perfettamente bilanciato, si riottiene B e C (oppure il suo
opposto),
ossia la rimozione della parte comune.
grazie

soun...@gmail.com
 ha scritto:

non ho capito qual'è la domanda

 
sounde...@gmail.com
 ha scritto:

nella quasi totalità di brani musicali registrati in stereofonia,
canale L R - vi è una parte comune, ossia dei segnali registrati
che si trovano sia in L che in R, la parte audio non comune crea la
netta distinzione tra i due canali. Ora, mediante C bisognerebbe
importare
e leggere un file audio, con frequenza di campionamento 44.100Hz -
separare mediante somma-sottrazione la parte la parte comune,
quello che resta (non comune) dovrebbe finire su un terzo file
separato
e creare un canale centrale.
riprovo:
B e C le componenti presenti solo a sx e dx
ovvero: L=A+B ed R=A+C i contenuti dei 2 ch.
Per rimuovere la parte comune si deve differenziare L ed R
se A è perfettamente bilanciato, si riottiene B e C (oppure il suo
opposto),  ossia la rimozione della parte comune.
spero di essere stato un pò più chiaro.....
geni del C unitevi....
grazie infinite

 
Mi pare che tu abbia le idee abbastanza chiare e sono cose abbastanza 
note. Anche il formato mp3, per esempio, sfrutta queste caratteristiche 
delle registrazioni stereofoniche per migliorare la compressione.
Quello che non ho capito è cosa chiedi al gruppo!
Forse come recuperare da un file audio i singoli campioni relativi ai 
due canali stereo?
Quel qualcuno riesce del primo post a cosa si riferisce? a fare che?
Ti prego non considerare saccente il tono della mia risposta, una mano 
vorrei dartela visto che attualmente sto lavorando ad un progetto di 
elaborazione audio (un progetto di studio non pensare chissà cosa), però 
mi spiazzi non capisco che vuoi sapere.

 grazie infinite

 separare mediante somma-sottrazione 
Se non ho capito male vuoi sapere quali operazioni eseguire sui campioni 
che sono nel dominio del tempo per avere le componenti spettrali comuni 
a due segnali.
Probabilmente ci sono già librerie o software (riproduttori o programmi  
di calcolo numerico) che hanno già la soluzione pronta.

Andrea D'Amore ha scritto:

Penso che il più sia leggere il file sorgente e scrivere quelli 
destinazione; poi fare l'operazione che chiede mi pare abbastanza banale.
Comunque si, sicuramente ci sono librerie. Io sto usando java, non so 
bene per il C; forse gstreamer.

 
sounde...@gmail.com
 ha scritto:

al gruppo chiedo come si implementa in C.
ottenere la componente comune "centrale"chiamiamola così, estratta
da left e right che la contgengono.
importo un file audio stereo
leggo LR
separo LR
estraggo C
risultato: tre file L R e C
che invierò a tre uscite separate dell'ampli
e riprodurre con tre diffusori, destro, sinistro e centrale.
grazie mille

 di calcolo numerico) che hanno già la soluzione pronta.
esatto.
ma alla fine devo trovarmi 3 canali completamente separati
di programmi ne ho provati molti, separare la parte comune
con CoolEdit si fa, ma non è la stessa cosa,
è come togliere la voce solista da una base musicale, lo faccio da
tempo
per lavoro, per quello basta una buona implementazione della tecnica
MSide.
insomma, tutti i campioni comuni vanno messi da parte.
mi interessa capire come sia possibile realizzarlo in c
saluti a tutti

 bene per il C; forse gstreamer.
se lo trovi banale e facile, invia lumi...
saluti

 mi interessa capire come sia possibile realizzarlo in c
Semplice, ti compri un bel manuale e ti studi il linguaggio e le sue
librerie standard.
Ecco come si fa in C.

 saluti
beh guarda informaticamente una volta riuscito a decodificare il file
(che praticamente corrisponde a studiarsi qualche libreria), la
questione diventa effettivamente banale.
Il fatto è che il problema nei termini in cui lo hai posto è un
sistema di 2 eq in tre incognite A, B e C; come mi insegni, questo
ammette infinite soluzioni e ci viene poco utile quindi. Bisogna
inserire un'altro vincolo p.e.
A = (R+L)/2
e risolvere poi è davvero una banalità.
Non so se la mia posizione sia plausibile (a buon senso mi pare di si)
o se si può pensare a qualcosa di più elaborato della semplice media;
certo è che un'altra equazione la devi dare senno c'è ben poco da
fare.
Visto che sono un semplice informatico e mi sono addentrato in una
materia che mi piace ma non è prettamente la mia spero di non aver
preso abbagli grossolani.
Un elettronico forse saprebbe darti ragguagli migliori.


interessante questa risposta...presa anche in seria considerazione.
forse ho sbagliato gruppo, posterò il tutto a "viaggi tropicali",
probabilmente scriveranno loro un pò di codice da sperimentare.
grazie mille del suggerimento

 mi interessa capire come sia possibile realizzarlo in c
Cioe' la domanda e' "qualcuno puo' scrivere il programma che fa questo"? 
Perche' l'algoritmo l'hai spiegato, serve solo implementarlo.
Non ho sottomano le FAQ, ma temo che questo tipo di richesta non sia 
contemplata. Nel gruppo si discute del linguaggio e magari di dettagli 
implementativi di algoritmi, ma non si puo' chiedere (e aspettare risposta) 
che qualcuno scriva per noi il nostro codice.
Deve essere per forza C? Non hai sottomano matlab? Puo' essere infinitamente 
utile per sperimentare con gli algoritmi: ad es. l'intera operazione di 
leggere/scrivere un file audio si condensa in 2 istruzioni: wavread/wavwrite 
(indovina cosa fanno :) , e qual punto fare le operazioni che hai descritto 
saranno forse 2/3 altri comandi (matlab lavora su vettori/matrici 
nativamente... non hai nemmeno bisogno di un ciclo for per elaborare tutti i 
campioni!).
Pleg 


non è mia intenzione far perdere tempo a nessuno nel programmare,
forse, in un newsgroup specifico qualcuno sta affrontando o è
interessato
alle stesse cose, e protrebbe avvenire uno scambio di opinioni, come è
giusto che sia.
certo che servirebbe implementarlo...mica si fa in due minuti.
se ero capace, probabilmente non chiedevo lumi qui.....
se qualcuno riesce con qualsiasi altro linguaggio che ben venga.
grazie per la dritta Matlab
saluti cordiali

 saluti
allora...
L=A+C
R=A+B
è un sistema di 2 equazioni in tre incognite A, B, C che ha infinite 
soluzioni (sempre che mi ricordo ancora bene)
Quindi c'è da trovare un altro vincolo...
A = (L+R)/2
a questo punto è banale trovare B e C
B = R-A
C = L-A
Non so se c'è una via più sensata che definire la parte comune A come 
media dei canali, bisognerebbe chiedere a qualche esperto di teoria dei 
segnali.
La parte comune la puoi effettivamente estrarre facilmente ma te ne fai 
ben poco.
In ogni caso questo non è decisamente un problema di programmazione. Per 
quello si riduce a studiarsi qualche libreria di interfacciamento con 
file audio ed eventualmente hardware e a pochi calcoli numerici.
Il problema che ti sei posto non è informatico ma matematico e la 
matematica dice che un sistema di due equazioni in tre incognite ha 
infinite soluzioni c'è poco da fa.
Poi non so magari ho preso una svista madornale!

 saluti
quello che tu hai scritto cioč:
L=A-C
R=A-B
č un sistema di 2 equazioni in tre incognite che quindi ha infinite 
soluzioni.
Bisogna aggiungere un altro vincolo perchč la soluzione sia unica. Per 
esempio io porrei:
A = (L+R)/2
e a quel punto č banale risolvere.
Quindi il tuo problema credo sia di carattere strettamente matematico. 
Per quanto riguarda l'implementazione software (in C o qualsiasi altro 
linguaggio) si tratta di interfacciarsi a qualche libreria per leggere 
il dati grezzi dal file origine e applicare le poche operazioni per 
risolvere il sistemino ai campioni dei due canali.
Se poi c'č un'altro modo per definire A questo dovresti chiedere a 
qualche esperto di segnali non a degli informatici.
Spero di non aver preso nessun grosso abbaglio... eventualmente non 
fatelo sapere alla prof di geometria ;)

 probabilmente scriveranno loro un pò di codice da sperimentare.
Prova a farmi capire, ma tu ti aspettavi che qualcuno qui ti scrivesse
il codice gratis?
-- 
-riko

 se qualcuno riesce con qualsiasi altro linguaggio che ben venga.
Cos'è che non riesci a fare? Hai cercato una libreria che gestisca i 
file audio? Hai cercato la documentazione del formato WAV?
E.

 insomma, tutti i campioni comuni vanno messi da parte.
Io non credo tu riesca a trovare la "parte comune" nel dominio del 
tempo, cioč confrontando i campioni del file.
Cosě, all'impronta, suggerisco un confronto sulle DFT.

 Così, all'impronta, suggerisco un confronto sulle DFT.
in effetti quella sarebbe un'idea... quello che non mi immagino è come 
andrebbe trattata la fase

 andrebbe trattata la fase
Non saprei, ragionavo solo sullo spettro delle ampiezze. Mi sembra una 
domanda da i.h.e.

 Cosě, all'impronta, suggerisco un confronto sulle DFT.
Cioe'?
Se come "parte comune" intende il modo comune, e' sicuramente un'operazione 
che va fatta nel dominio del tempo, non della frequenza.
Da come ha scritto le equazioni, sembrava proprio un'operazione da fare nel 
tempo.
Pleg 

 che va fatta nel dominio del tempo, non della frequenza.
Non so che intendi con "modo" :-)
Ci ho riflettuto e penso tu abbia ragione, il contenuto in frequenza 
chiaramente non tiene conto della distribuzione temporale e non è utile.
Dici che il confronto vada fatto campione per campione, supposto che la 
componente comune di segnale sia sincrona nelle due tracce?
In questo caso basterebbe caricare i due vettori campionati e fare una 
differenza campione per campione.

> Non so che intendi con "modo" :-)
Scusa, stavo parlando da elettronico :)
Dati due segnali A e B, si distingue fra "modo comune" cm=(A+B)/2 e "modo 
differenziale" dm=(A-B)/2 : i due segnali originali sono semplicemente 
A=cm+dm, B=cm-dm . Un modo un po' complicato di prendere la media, ed 
esprimere i segnali come differenza rispetto alla media :)
Credo sia una delle tecniche base per la compressione del segnale: se i 
segnali sono simili, il modo differenziale sara' piccolo rispetto al modo 
comune (e quindi, ad es., potresti esprimere due segnali a 16 bit come un 
segnale comune a 16 bit e uno differenziale a 8 bit).
La domanda originale mi sembrava una cosa del genere.
Non so che tipo di processazione del segnale intendessi eseguire nel dominio 
della frequenza: puoi spiegare?
Pleg 

 della frequenza: puoi spiegare?
Nessuna, solo una confusione mia: leggendo  l'OP mi era venuto in mente 
che la componente comune, cioč il segnale effettivamennte replicato sui 
due canali, fosse evidente nel contenuto spettrale sotto forma di pezzi 
di spettro identici.
Questo č falso perché un segnale sovrapposto ad una delle due tracce, 
una voce o uno strumento, possono tranquillamente sovrapporsi in 
frequenza alla componente comune.
E il libro di Segnali prende polvere...

 
Ok ma il tizio del post voleva 3 canali. Io li immaginavo come media, 
differenza dala media sx e dx visto che come l'ha detta lui all'inizio 
mi pare impossibile risolvere.
mi chiedevo... è un'eresia da ignorante?

qualcuno riesce?
Credo che il vero problema risieda nel fatto che la "parte comune" è
influenzata dal contenuto dei due canali. Se immagini, ad esempio, una
parte comune compresa fra un canale destro vuoto e un canale sinistro
che riproduce una sinfonia di Wagner, ti renderai conto che - anche a
livello teorico - l'elaborazione è tutt'altro che semplice.
Ti consiglio un paio di siti per una infarinatura sull'elaborazione
del suono, essi trattano in particolare la codifica in mp3:
http://www.lithium.it/articolo0012p1.htm
http://www.maurograziani.org/text_pages/analisi/l02/MG_Audio_analisi_02.html
in cui noti come la DFT (trasformata discreta di Fourier) fa da
padrona, assieme a interessanti concetti di psicoacustica.
Quindi ti scarichi LAME (
http://lame.sourceforge.net
) che è un
(de)codificatore mp3 multipiattaforma, all'interno del quale troverai
tutto il necessario per tentare di convertire in codice C il tuo
interessante desiderio. Mi raccomando leggi la licenza d'uso!

 interessante desiderio. Mi raccomando leggi la licenza d'uso!
il sito di Graziani lo conosco a memoria,
argomenti triti e ritriti.
per il codec Lame darò un'occhiata.
grazie e saluti cordiali

 grazie e saluti cordiali
ma uno stralcio di codice?
si aspettano i più coraggiosi...
grazie a tutti

 pare impossibile risolvere.
In effetti la storia dei 3 canali non e' chiara. Come e' gia' stato scritto, 
per 3 canali hai infinite soluzioni. In effetti credo non fosse chiaro fin 
dall'inizio che cosa contenessero, questi 3 canali. Se significa una cosa 
come:
- il canale dx ha un violino e una chitarra
- il canale sx ha la stessa chitarra, piu' una voce
- separare: sul canale 1 la chitarra (comune), sul canale 2 il violino (solo 
a dx), sul canale 3 la voce (solo a sx)
... allora ho il sospetto che possa essere un problema aperto nel campo 
dell'elaborazione del segnale... altro che C: non so nemmeno se esista un 
algoritmo capace di farlo (non si tratta di processazione in 
tempo/frequenza/filtraggi vari, si tratta proprio di far capire al computer 
come distinguere "sorgenti" diverse... a naso direi un po' come lo speech 
recognition, ma molto piu' complicato :)
Pleg 


aspetta aspetta,
non facciamo confusione...
un qualsiasi strumento, generando un suono complesso
fatto da fondamentali e armoniche, può trovarsi durante l'esecuzione
dal vivo
in un qualsiasi punto del soundstage (sapete cosè?) penso di si....
ora: se l'esecutore si posiziona al centro, i due microfoni (coppia
stereo),
prenderanno in base al posizionamento LR più o meno segnale sinistro
destro
la componente centrale, dovremmo in questo caso trovarla in entrambi i
canali con la stessa quantità
a questo punto dovremmo separare la parte left, right e center in 3
canali distinti.
se il canale dx ha un violino e una chitarra, anche il canale sinistro
avrà un violino e una chitarra ma
in misura minore, dato che, oltre al suono diretto si registrano suoni
riflessi per il 70/80%.
per lavoro separo la voce dalle base da molti anni, non è
difficile...l'unica cosa che resta,
e quindi non ci sarà MAI una separazione al 100% è il riverbero.
prova a rileggere il primo post, ora sicuramente con un'altra
visione....almeno spero.
saluti

 visione....almeno spero.
Secondo me stai dicendo che C=(L+R)/2, ma non te ne rendi conto...
E.

 si aspettano i più coraggiosi...
Hai guardato la documentazione dei file WAV? Hai studiato il C? Quale 
difficoltà trovi nell'implementare l'algoritmo?
E.

 
sounde...@gmail.com
 ha scritto:

appena trovo il tempo lo farò..
per il C dovrei tornare indietro di 20 anni, programmo ma non a
livelli elevati,
qui ci serve un pò di stoffa e tempo...
saluti

?manu* ha scritto:

ho nettamente la stessa sensazione!
Anche perchč c'č poco da fare... se non ci si mette un'altra equazione 
ci sono infinite soluzioni.
Questa č matematica non un'opinione!

soun...@gmail.com
 ha scritto:

il tempo costa e con la staffa costa pure di più!
Qui ci vuole un'equazione! senno il problema resta indeterminato!

> Secondo me stai dicendo che C=(L+R)/2, ma non te ne rendi conto...
Ma se fosse cosi' credo che qualunque programma di elaborazione audio possa 
fare una media e una differenza... io non ho la minima idea di quale sia il 
problema, e comincio a pensare che nemmeno l'OP lo sappia.
Pleg