Страницы

Поиск по вопросам

понедельник, 10 февраля 2020 г.

Разложение wav файла на массив байтов и выполнение БПФ

#c_sharp #wav


Здравствуйте. Подскажите, пожалуйста, я с помощью этого кода получил массив байтов
и записал его в файл.

`using (var file = System.IO.File.OpenRead(inFile))
            {
                byte[] buffer = new byte[file.Length];
                file.Read(buffer, 0, buffer.Length);
                StreamWriter sw = new StreamWriter("ConvertedFile\\bytes.txt", false);

                foreach (byte b in buffer)
                {
                    sw.WriteLine(b);
                }

                sw.Close();
            }`


Теперь его и нужно отправлять на вход быстрого преобразования Фурье?

Подскажите, пожалуйста ещё, я загружаю wav файл в метод длительностью 10 секунд и
у меня выбрасывается исключение

Что мне нужно сделать?
    


Ответы

Ответ 1



Приветствую! Согласно структуре WAV, первые 44 байта WAV файла служат для хранения служебной информации. Соответственно, вам нужно считать в byte[] только полезные амплитуды, хранящиеся в секции data. Обычно на вход БПФ подаются вещественные значения амплитуд, поэтому вы должны сконвертировать секцию data, которую вы считали в byte[] в массив double[], исходя из того, что каждая амплитуда кодируется 4-мя байтами. Для БПФ можете воспользоваться бесплатным математическим пакетом Numerics, предварительно переписав ваши double[] в массив комплексных чисел Complex[], оставляя мнимую часть пустой. Вот код чтения полезной секции из WAV: public static Double[] prepare(String wavePath) { Double[] data; byte[] wave; System.IO.FileStream WaveFile = System.IO.File.OpenRead(wavePath); wave = new byte[WaveFile.Length]; data = new Double[(wave.Length - 44) / 4];//shifting the headers out of the PCM data; WaveFile.Read(wave,0,Convert.ToInt32(WaveFile.Length));//read the wave file into the wave variable /***********Converting and PCM accounting***************/ for (int i = 0; i < data.Length; i++) { data[i] = (BitConverter.ToInt32(wave, 44+i*4)) / 4 294 967 296.0; } return data; }

Комментариев нет:

Отправить комментарий