#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; }
Комментариев нет:
Отправить комментарий