java - significato - curve ponderazione a b c



Rappresentazione grafica del tono(frequenza) di un suono (2)

Voglio tracciare il tono di un suono in un grafico.

Attualmente posso tracciare l'ampiezza. Il grafico sottostante viene creato dai dati restituiti da getUnscaledAmplitude() :

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(file)));
byte[] bytes = new byte[(int) (audioInputStream.getFrameLength()) * (audioInputStream.getFormat().getFrameSize())];
audioInputStream.read(bytes);

// Get amplitude values for each audio channel in an array.
graphData = type.getUnscaledAmplitude(bytes, 1);


public int[][] getUnscaledAmplitude(byte[] eightBitByteArray, int nbChannels)
{
    int[][] toReturn = new int[nbChannels][eightBitByteArray.length / (2 * nbChannels)];
    int index = 0;

    for (int audioByte = 0; audioByte < eightBitByteArray.length;)
    {
        for (int channel = 0; channel < nbChannels; channel++)
        {
            // Do the byte to sample conversion.
            int low = (int) eightBitByteArray[audioByte];
            audioByte++;
            int high = (int) eightBitByteArray[audioByte];
            audioByte++;
            int sample = (high << 8) + (low & 0x00ff);

            toReturn[channel][index] = sample;
        }
        index++;
    }

    return toReturn;
}

Ma ho bisogno di mostrare l'intonazione dell'audio, non l'ampiezza. La trasformata di Fourier veloce sembra avere il tono, ma ha bisogno di conoscere più variabili rispetto ai byte grezzi che ho, ed è molto complessa e matematica.

C'è un modo per farlo?

https://ffff65535.com


Ci sono several other questions su su questo problema. Forse questi aiuteranno.

Invece, potresti provare a trovare una copia di Digital Audio con Java di Craig Lindley. Non credo che sia più in stampa, ma la copia sulla mia scrivania ha una sezione sulla FFT e anche un'applicazione di esempio di un accordatore per chitarra.


Fast Fourier Transform non ha bisogno di sapere di più dei byte di input che hai. Non essere spaventato dall'articolo di Wikipedia. Un algoritmo FFT prenderà il tuo segnale di input (con gli algoritmi FFT comuni il numero di campioni è richiesto per essere una potenza di 2, ad esempio 256, 512, 1024) e restituire un vettore di numeri complessi con le stesse dimensioni. Poiché il tuo input è reale, non complesso, (porzione immaginaria impostata a zero) il vettore restituito sarà simmetrico. Solo la metà di esso conterrà dati. Poiché non ti interessa la fase, puoi semplicemente prendere la grandezza dei numeri complessi, che è sqrt (a ^ 2 + b ^ 2). Anche solo il valore absoulte di un numero complesso può funzionare, in alcune lingue ciò equivale all'espressione precedente.

Sono disponibili implementazioni Java di FFT, ad esempio: http://www.cs.princeton.edu/introcs/97data/FFT.java.html

Lo pseudo codice sarà simile al seguente:

Complex in[1024];
Complex out[1024];
Copy your signal into in
FFT(in, out)
for every member of out compute sqrt(a^2+b^2)
To find frequency with highest power scan for the maximum value in the first 512 points in out

L'uscita conterrà intervalli per frequenze comprese tra zero e metà della frequenza di campionamento.

Poiché FFT assume un segnale ripetuto, è possibile che si desideri applicare una window al segnale di ingresso. Ma non preoccuparti di questo all'inizio.

Puoi trovare maggiori informazioni sul web, ad esempio: FFT per principianti

Inoltre, quando Oli rileva quando sono presenti più frequenze, l'intonazione percepita è un phenomenon più complesso.





pitch