Как построить спектр wav-файла с помощью FFT?

Примечание: это не дубликат, у меня есть конкретные требования, кроме связанных вопросов.

для начала я хочу построить спектр аудиофайла (.wav) так же, как и то, что делает audacity (аналогично:как нарисовать частотный спектр из преобразования Фурье).

до сих пор я могу читать и писать wav-файлы. Но моя проблема в том, что я не знаю точно, какие значения мне нужно передать функции FFT. Кстати, я использую экзокортекс для FFT в C#. Функция FFT требует, чтобы я передал массив комплексных чисел с правильным размером (512, 1024,... Я предполагаю), необязательный целочисленный параметр для длины и направление Фурье (вперед/назад).

Конкретные Вопросы:

  1. комплекс (класс) из библиотеки Экзокортекса имеет два значения, а именно реальное и мнимое. У меня есть массив образцов, так что должно быть реальным, а что должно быть воображаемым?
  2. у меня есть wav-файл, поэтому его длина должна предполагается переменная. Как передать это функции FFT? Должен ли я выбрать размер (512/1024/etc), разделить все образцы на размер, а затем передать все это в БПФ?
  3. как узнать, какие частоты должны быть перечислены на оси x?
  4. как мне построить данные FFT? (Я хочу, чтобы ось x была частотой, а ось y-децибелами)

Если вы не понимаете, что я имею в виду, попробуйте использовать Audacity, импортируйте аудиофайл, затем нажмите Analyze > Спектр Участка. Эти вещи хотят воссоздать. Пожалуйста, ответьте на мой вопрос подробно, потому что я действительно хочу это узнать. У меня есть только небольшая информация об этом. Я всего лишь новичок в цифровой обработке сигналов. Также, насколько это возможно, пожалуйста, не направляйте меня на другие сайты FFT, потому что они не отвечают на мой вопрос конкретно.


EDIT:

Я сделал некоторые чтения и узнал, как FFT аудио данных, но только в полномочия 2. Так как же мне сделать то же самое? в аудио файл длиной не полномочий 2? По некоторым данным мне нужно использовать "окно". Я также сделал некоторые поиски об этом и выяснил, что требуется только часть формы волны для обработки позже. Помните выше, что я хочу получить БПФ аудиофайла, А не его часть. Так что же мне теперь делать? Пожалуйста, помогите :(

1 ответов


подпись

public static void  FFT( float[] data, int length, FourierDirection direction )
  1. вы передаете массив комплексных чисел, представленных в виде пар. Поскольку у вас есть только реальные числа (образцы), вы должны поместить свои образцы в четные местоположения в массиве - данные[0], данные[2], Данные[4] и так далее. Нечетные местоположения должны быть 0, data[1] = data[3] = 0...
  2. длина-это количество образцов, на которых вы хотите рассчитать свой БПФ, это должно быть ровно половина длины массива данных. Вы можете FFT весь ваш WAV или его части-зависит от того, что вы хотите увидеть. Audacity построит спектр мощности выбранной части файла, если вы хотите сделать то же самое, передайте всю WAV или выбранные части.
  3. FFT покажет вам только частоты до половины вашей частоты дискретизации. Таким образом, вы должны иметь значения от 0 до половины частоты дискретизации. Количество значений зависит от количества образцов, которые у вас есть (количество образцов повлияет на точность расчет)
  4. 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);

обратите внимание, что здесь второй параметр равен длине массива, так как каждый член массива является комплексным числом. Я получаю тот же результат, что и раньше.

Я думаю, что пропустил сложную перегрузку раньше. Я кажусь менее подверженным ошибкам и более естественным для использования, если ваши данные уже не поступают парами.