Как построить спектр wav-файла с помощью FFT?
Примечание: это не дубликат, у меня есть конкретные требования, кроме связанных вопросов.
для начала я хочу построить спектр аудиофайла (.wav) так же, как и то, что делает audacity (аналогично:как нарисовать частотный спектр из преобразования Фурье).
до сих пор я могу читать и писать wav-файлы. Но моя проблема в том, что я не знаю точно, какие значения мне нужно передать функции FFT. Кстати, я использую экзокортекс для FFT в C#. Функция FFT требует, чтобы я передал массив комплексных чисел с правильным размером (512, 1024,... Я предполагаю), необязательный целочисленный параметр для длины и направление Фурье (вперед/назад).
Конкретные Вопросы:
- комплекс (класс) из библиотеки Экзокортекса имеет два значения, а именно реальное и мнимое. У меня есть массив образцов, так что должно быть реальным, а что должно быть воображаемым?
- у меня есть wav-файл, поэтому его длина должна предполагается переменная. Как передать это функции FFT? Должен ли я выбрать размер (512/1024/etc), разделить все образцы на размер, а затем передать все это в БПФ?
- как узнать, какие частоты должны быть перечислены на оси x?
- как мне построить данные FFT? (Я хочу, чтобы ось x была частотой, а ось y-децибелами)
Если вы не понимаете, что я имею в виду, попробуйте использовать Audacity, импортируйте аудиофайл, затем нажмите Analyze > Спектр Участка. Эти вещи хотят воссоздать. Пожалуйста, ответьте на мой вопрос подробно, потому что я действительно хочу это узнать. У меня есть только небольшая информация об этом. Я всего лишь новичок в цифровой обработке сигналов. Также, насколько это возможно, пожалуйста, не направляйте меня на другие сайты FFT, потому что они не отвечают на мой вопрос конкретно.
EDIT:
Я сделал некоторые чтения и узнал, как FFT аудио данных, но только в полномочия 2. Так как же мне сделать то же самое? в аудио файл длиной не полномочий 2? По некоторым данным мне нужно использовать "окно". Я также сделал некоторые поиски об этом и выяснил, что требуется только часть формы волны для обработки позже. Помните выше, что я хочу получить БПФ аудиофайла, А не его часть. Так что же мне теперь делать? Пожалуйста, помогите :(
1 ответов
подпись
public static void FFT( float[] data, int length, FourierDirection direction )
- вы передаете массив комплексных чисел, представленных в виде пар. Поскольку у вас есть только реальные числа (образцы), вы должны поместить свои образцы в четные местоположения в массиве - данные[0], данные[2], Данные[4] и так далее. Нечетные местоположения должны быть 0, data[1] = data[3] = 0...
- длина-это количество образцов, на которых вы хотите рассчитать свой БПФ, это должно быть ровно половина длины массива данных. Вы можете FFT весь ваш WAV или его части-зависит от того, что вы хотите увидеть. Audacity построит спектр мощности выбранной части файла, если вы хотите сделать то же самое, передайте всю WAV или выбранные части.
- FFT покажет вам только частоты до половины вашей частоты дискретизации. Таким образом, вы должны иметь значения от 0 до половины частоты дискретизации. Количество значений зависит от количества образцов, которые у вас есть (количество образцов повлияет на точность расчет)
- Audacity отображает спектр мощности. Вы должны взять каждую пару комплексных чисел в получаемом массиве и вычислить ее ABS. ABS определяется как sqrt (r^2+i^2). Каждое значение ABS будет соответствовать одной частоте.
вот пример рабочего кода:
float[] data = new float[8];
data[0] = 1; data[2] = 1; data[4] = 1; data[6] = 1;
Fourier.FFT(data, data.Length/2, FourierDirection.Forward);
Я даю ему 4 образца, все равно. Так что я ожидаю получить что-то только на частоте 0. И действительно, после его запуска я получаю
data[0] == 1, data[2] == 1, data[4] = = 1, data[6] = = 1
и другие 0.
Если я хочу использовать сложную перегрузку массива
Complex[] data2 = new Complex[4];
data2[0] = new Complex(1,0);
data2[1] = new Complex(1, 0);
data2[2] = new Complex(1, 0);
data2[3] = new Complex(1, 0);
Fourier.FFT(data2,data2.Length,FourierDirection.Forward);
обратите внимание, что здесь второй параметр равен длине массива, так как каждый член массива является комплексным числом. Я получаю тот же результат, что и раньше.
Я думаю, что пропустил сложную перегрузку раньше. Я кажусь менее подверженным ошибкам и более естественным для использования, если ваши данные уже не поступают парами.