Domanda

Ho implementato un algoritmo di base Karplus-Strong.
Ringbuffer, riempimento con rumore bianco, uscita un campione dalla parte anteriore e aggiungere la media dei primi due elementi alla fine ed eliminare il primo elemento. Ripetere ultimo a passi.

Per risultati migliori e controllo su di loro ho cercato di implementare una versione estesa dell'algoritmo.
Pertanto, invece di un filtro di media Ho bisogno di un filtro di frequenza come un filtro passa-basso.
Mio filtro di media ha due ingressi ed un'uscita: avg (a, b) = (a + b) / 2

Il codice di esempio nella pagina di wikipedia dà il maggior numero di uscite come ingressi.
http://en.wikipedia.org/wiki/Low-pass_filter

Ho trovato altre versioni (matematica) come:
http://cnx.org/content/m15490/latest/
H (z) = (1+ (1 / z)) / 2
Credo che z è un numero complesso.

Entrambe le versioni dispongono di due ingressi, ma anche due uscite.
Come faccio ad avere un valore significativo da questo?
O devo riscrivere le parti più grandi dell'algoritmo?
Se questo è il caso dove posso trovare una buona spiegazione di esso?

È stato utile?

Soluzione

Il filtro è una specializzazione del filtro Finite Impulse Response. Stai usando il media mobile metodo per selezionare i coefficienti, utilizzando N = 1. si è già un filtro passa-basso.

Calcolo del coefficiente e l'ordine per il filtro di sintonizzarsi ad una frequenza specifica risposta coinvolge matematica difficile. La cosa migliore da fare è quella di utilizzare un pacchetto software per il calcolo dei coefficienti, se la media mobile non va bene per la bolletta. MATLAB è la solita scelta, GNU Octave è un'opzione open source.

Altri suggerimenti

I filtri possono espressa in diversi modi:

  1. Nella complesso pianura, tuo esempio H (z) = (1+ (1 / z)) / 2
  2. Come un filtro, y[i] = h[0]*x[i] + h[1]*x[i-1] + h[2]*x[i-2] + ...
  3. Nel dominio della frequenza, Y [f] = H [f] * X [f]

Il secondo di questi è in realtà una convoluzione di h e x array. Questo è anche il più facile da capire.

La risposta precedente ha spiegato da dove cominciare a costruire un filtro. Supponendo di avere i vostri coefficienti del filtro, i h di, allora è semplicemente sommando su quelli non negativi.

Credo di vedere quello che chiedete. Anche se non avete bisogno di più di un'uscita. Dalla pagina Wikipedia l'algoritmo Algoritmo di Karplus-Strong necessita un buffer di lunghezza L. Se abbiamo M coefficienti di filtro (h) che dà un'uscita del modulo,

y[i] = x[i] + h[0]*y[i-L] + h[1]*y[i-(L+1)] + h[2]*y[i-(L+2)] + ...

Il Karplus-Strong sintesi da qui utilizza un buffer circolare per contenere le ultime uscite L, y[i-1],...,y[i-L]. Questo viene inizializzata ad essere i valori di rumorosità x[i] per i<=L; tuttavia, per i>L x[i]=0. L'algoritmo sarà efficiente dello spazio come voi solo memorizzare i valori L. Il x[i] segnale per i>L viene aggiunto al buffer ad anello.

Infine, come una nota di avvertimento, se non si sta attenti sia con il numero di coefficienti h ei valori delle uscite y non può avere il comportamento desiderato.

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