Domanda

Mi chiedo se una cosa del genere sia possibile (e relativamente facile da fare) e, in tal caso, come potrei farlo?

Vorrei fare un filtro di banda su un file wave che sto riproducendo. Qualcosa di simile al " equalizzatore " vedi nella maggior parte delle applicazioni simili a Winamp.
La mia idea è, tuttavia, non di equalizzare il suono, ma di utilizzare valori dB molto alti negativi, quasi a uccidere la banda che sto filtrando.

La prima domanda è: DirectSound mi dà qualcosa che mi permette di farlo?
In caso contrario: come procederesti per implementarlo?
So (anche se non lo capisco del tutto) che puoi convertire dalla forma d'onda campionata alla distribuzione delle frequenze usando una trasformata di Fourier veloce. Ora, ovviamente, non posso tornare da quella distribuzione alla forma d'onda originale dopo aver modificato i valori di ampiezza di determinate frequenze :-)

Come potrei fare qualcosa del genere?

Inoltre, quanto preciso posso creare questi filtri? (Se volessi filtrare qualsiasi cosa da 2250Hz a 2275Hz, quale sarebbe l'errore che avrebbe un filtro? Da quale dipendenza potrei ottenere la massima precisione?)

Grazie!

È stato utile?

Soluzione

Non so se DirectSound offre questa funzionalità, suppongo che non lo sia poiché DSP è abbastanza complicato e spesso varia molto da situazione a situazione. Quello che vuoi fare è in genere chiamato " filtro " in DSP (elaborazione del segnale digitale). Molte volte ciò implica l'uso di un filtro FIR (risposta agli impulsi finiti). Ci sono molte librerie là fuori per fare esattamente quello che vuoi. Uno degli aspetti più difficili della progettazione dei filtri è che ci sono sempre dei compromessi tra velocità, precisione ed errore. Nel tuo esempio, sarai in grado di rimuovere il segnale tra le frequenze ma ciò influirà anche sulle frequenze circostanti. L'importo che avrà effetto è correlato al tempo di elaborazione e alla progettazione del filtro.

Forse inizia qui (matematica pesante): FIR Filter

Quindi google per le tue informazioni relative alla FIR specifica di Windows / DirectSound

Altri suggerimenti

DirectSound non esegue il filtraggio della banda come descritto qui, per quanto ne so.

L'idea generale alla base del filtro passa-banda è quella di utilizzare le linee di ritardo, che prendono l'uscita del segnale e la ritrasmettono nel flusso di ingresso, con un fattore di ritardo e decadimento (o attenuazione) specificato. La progettazione attenta del filtro ti permetterà di amplificare o attenuare specifiche gamme di frequenza nella tua sorgente audio. Si noti che questa tecnica non utilizza FFT, tranne come forse uno strumento diagnostico durante il test degli effetti filtro. Le tecniche FFT svolgono un lavoro più preciso nel limitare o amplificare le frequenze, ma le linee di ritardo sono generalmente più veloci (e molto più facili da codificare).

Per elaborare un file WAV (invece di fare sintesi / filtro in tempo reale), eseguire una linea di ritardo sul buffer audio è semplice come:

for (int i = 0; i < samples.Length - delay; i++)
{
    samples[i + delay] += samples[i] * decay;
}

In pratica è un po 'più complicato di questo (ad esempio, devi affrontare i potenziali valori di overflow e alcuni tipi di linee di ritardo devono essere eseguite al contrario, il che è sempre una seccatura nella codifica in stile C), ovviamente.

Per quanto sia preciso il filtro, dipende solo da quanto è progettato (è molto difficile). Quando si progetta un filtro utilizzando le linee di ritardo, si sta essenzialmente facendo la stessa cosa che gli ingegneri elettrici hanno fatto (e continuano a fare) nei decenni precedenti ai microprocessori economici.

DirectSound non offre alcuna possibilità di elaborazione del segnale. Esistono diverse tecniche che puoi utilizzare per fare ciò che desideri. È possibile utilizzare FFT per fare ciò che si desidera, ma probabilmente non è il metodo migliore o più semplice. Dovresti leggere su DSP audio, in particolare il filtro digitale (IIR, FIR). C'è un buon libro DSP disponibile online gratuitamente chiamato La guida dello scienziato e dell'ingegnere all'elaborazione del segnale digitale che vale sicuramente la pena uno sguardo. Ci sono anche molti altri buoni libri DSP disponibili su Amazon ecc.

Non conosco biblioteche che si occupano direttamente di questo genere di cose.

Puoi ottenere ciò che desideri con trasformazioni di Fourier, implementazioni come FFTW eseguono il calcolo per tu ma nella mia esperienza sei piuttosto sgradevole con cui lavorare e usi prodigiose quantità di memoria, specialmente se vuoi elaborare bit audio più lunghi in un colpo solo.

L'idea di base per applicare l'eq usando FFT è questa:

  1. Ottieni il tuo audio. L'audio è solo una gamma molto lunga di valori (campioni) che è lo spostamento del cono dell'altoparlante / nel tempo.
  2. Prendi la trasformata di Fourier dell'audio (il libary lo farà, ma dovrai deviare i campioni audio nel formato giusto. In questo modo i campioni basati sul tempo vengono convertiti in una rappresentazione basata sulla frequenza - essenzialmente converte il segnale in mostra la distrobuzione delle frequenze nel segnale.
  3. Dividi la frequenza di distribuzione: dividi la distribuzione in regioni, ogni regione sarà un intervallo di frequenze.
  4. È quindi possibile eseguire regolazioni sulle bande di frequenza: ad esempio, è possibile azzerare una regione per rimuoverne tutte le tracce.
  5. Prendi la trasformata inversa di Fourier della distrobuzione di frequenza aggiornata. Ciò restituirà la rappresentazione nel dominio del tempo, ricostruendo una (approssimazione) del segnale originale, ma con le modifiche apportate.

Fare qualcosa del genere ti permetterà di manipolare accuratamente le frequenze presenti nel tuo audio, dandoti il ??tipo di controllo che sembri desiderare. Attenzione, tuttavia, che non è semplice da implementare.

Consiglio di leggere l'argomento. Il rilevamento delle battute è strettamente correlato a molte di queste (utilizza molto le tecniche di base): prova le prime sezioni qui come inizio.

Spero che aiuti un po '.

DirectSound potrebbe non supportarlo direttamente, ma DirectShow dovrebbe. Potresti usare invece quell'API?

Secondo l'idea del filtro FIR. Per ottenere una tacca stretta avrai bisogno di un kernel del filtro lungo.

Fondamentalmente usi la convoluzione del flusso di input rispetto a un insieme di valori (il kernel). Ogni campione di output è una somma dei precedenti N campioni moltiplicati per la voce corrispondente nel kernel del filtro.

Quindi è necessario mantenere un array di kernel e un FIFO o un buffer circolare dello stesso numero di campioni.

Sono calcolatori del kernel filtro FIR sul web, solo Google "quot Calcolatore filtro FIR".

Dovresti essere in grado di fare un FFT, scherzare nel dominio della frequenza (ridimensionare i bin della frequenza) e quindi fare un IFFT per recuperare il segnale nel dominio del tempo. Altrimenti, la progettazione di filtri con ScopeFIR o MATLAB è piuttosto semplice. ScopeFIR può facilmente progettare un filtro passa-banda e fornirti i coefficienti in modo da poter fare una convoluzione sul segnale. Ecco un tutorial dal sito ScopeFIR: http://www.iowegian.com/fir/ insegnante / firintro.htm

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top