KotsanisNakos Ответов: 1

Как конвертировать WAV аудио в частотный файл на JAVA?


Я хочу обратиться стерео wav в частоту и сохраните их в txt.
Идея заключается в том, что я должен загрузить wav, прочитать его и, наконец, сохранить частоты в моем компьютере в виде txt.
Например
0:00 мин 50 Гц
0:01 мин 57 Гц
....
1:10 мин 450 Гц


Я пытаюсь запустить и отредактировать множество проектов, но мне это не удается.(Слишком много неудачных попыток с сэмплами, байтами, БПФ и т. д)
Есть ли исходный код, который это делает?Спасибо

Что я уже пробовал:

ByteArrayOutputStream out = new ByteArrayOutputStream();
                running = true;
                int n = 0;
                byte[] buffer = new byte[(int) 1024];
                try { while (running) {
                               n++;
                    if (n > 200000){break;}                  
                    int count = 0;
                    count = outDinSound.read(buffer, 0, 1024);
                        if (count > 0) {out.write(buffer, 0, count);}
                                      }
                    byte b[] = out.toByteArray();
<pre>final int totalSize = b.length;
                    int amountPossible = totalSize / 1024;
                    System.out.println("Frequencies captured: "+totalSize+"         "+amountPossible+" * 1024");
                    System.out.println("_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _");                  
                    Complex[][] results = new Complex[amountPossible][];
                    System.out.println("                    * * *   STARTING ANALYSIS   * * *");
                    for (int times = 0; times < amountPossible; times++) {
                        Complex[] complex = new Complex[1024]; 
                        for (int i = 0; i < 1024; i++)                                   {
                        complex[i] = new Complex(b[(times * 1024) + i], 0);              }
                        results[times] = FFT.fft(complex);
                                                                         }

Kenneth Haugland

На самом деле мне не совсем ясно, чего вы на самом деле хотите. Что это значит:
0:00 мин 50 Гц
0:01 мин 57 Гц
....
1:10 мин 450 Гц ?
В общем, БПФ даст вам все частотные данные в течение заданного промежутка времени, а не одну частоту каждую секунду.

KotsanisNakos

Да, вы правы. Временной промежуток, который я видел до сих пор в проектах, которые я пытаюсь создать(или изменить), был другим и не был чем-то стабильным.
В примере я пилю вас, что для каждой милесекунды я читаю частоту(на самом деле это много freq, и я нахожу среднее значение для этой милесекунды [propably false]) из FFT и записываю ее в txt. Моя проблема, которую я не могу найти решения, заключается в том, что я хочу прочитать образцы, затем БПФ прочитать частоту, затем вычислить частоту В Гц, а затем записать в файл .txt

KotsanisNakos

Идея того, как я хочу это сделать, примерно такова::

|WAV из Пути|- и GT;|| Ява -&ГТ; образцы-&ГТ;БПФ-&ГТ;частоты за промежуток времени|| -&ГТ; |част в txt|

1 Ответов

Рейтинг:
9

Kenneth Haugland

Это довольно сложная задача, которую вы ставите перед собой, и вы до сих пор не объяснили точно, чего вы хотите. Поэтому мой совет вам-реализовать алгоритм БПФ, который, как вы знаете, работает, а затем попытаться реализовать нужный код. Если вы застряли, вы можете улучшить свой вопрос.

Но вы должны знать, что если вам нужен эквалайзер, который показывает некоторый уровень шума, связанный с октавной полосой, вам вообще не нужен БПФ. Вы можете просто получить соответствующий фильтр и свернуть его с сигналом времени. Та же процедура может быть также использована, с другим фильтром, для взвешенных децибел, которые также обычно используются для получения уровня шума в виде одной цифры.

Но эти подходы требуют знаний, которые не тривиально реализуются на форуме вопросов и ответов.