Комплексные числа .. Arghh

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

Я кодировал алгоритм, но он использует комплексные числа, и я не знаю, как манипулировать / выполнять вычисления на них. Вот код:

#include <iostream>
#include <complex>
#include <vector>

using namespace std;

const double PI = 3.14159265358979323846;

vector< complex<double> > DFT(vector< complex<double> >& theData)
{
// Define the Size of the read in vector
const int S = theData.size();

// Initalise new vector with size of S
vector< complex<double> > out(S, 0);
for(unsigned i=0; (i < S); i++)
{
out[i] = complex<double>(0.0, 0.0);
for(unsigned j=0; (j < S); j++)
{
out[i] += theData[j] * polar<double>(2, (-2 * PI * i * j / S));
}
}

return out;
}

int main(int argc, char *argv[]) {
vector< complex<double> > numbers;

numbers.push_back(128);
numbers.push_back(127);

vector< complex<double> > testing = DFT(numbers);

for(unsigned i=0; (i < testing.size()); i++)
{
cout << testing[i] << endl;
}
}

Теперь, если я хотел выполнить, например:

if(testing[i] >= 0)
{
// blah blah
}

Тогда он вернет ошибку. Есть идеи или предложения? Можно ли создать ДПФ без использования сложных чисел?

0

Решение

Кто бы ни дал вам ваши инструкции, он не говорил вам пересчитывать пересечения нуля по результатам DFT / FFT. Это было бы бессмысленно. (Если они говорили вам это сделать, они были невежественны. У вас есть мое разрешение смеяться над ними за то, что вы дали вам такие нелепые инструкции). Скорее, они говорили вам пересчитать пересечения нуля на исходных данных, а также посмотреть на БПФ ваших данных.

Тем не мение,

  • Скорость пересечения нуля — довольно дурацкая отправная точка для распознавания речи. Может быть, вы можете получить где-нибудь с этим. С небольшой гиперболой я могу сказать, что пересечение нуля — это наименее надежный анализ DSP, который вы можете сделать. Тем не менее, это также просто, и исследования по распознаванию речи продолжаются долгое время, так что, возможно, есть некоторые исследования по этому вопросу. ОБНОВЛЕНИЕ / ИСПРАВЛЕНИЕ: это немного гипербола. На самом деле я считаю, что многие методы распознавания речи действительно используют пересечение нуля, но вы должны знать, что вы делаете в первую очередь, потому что он не очень устойчив и чувствителен ко многим видам ошибок, таких как ошибки октавы. Когда вы используете пересечение нуля, хорошей идеей будет сначала пропустить низкую передачу (возможно, агрессивно). Обязательно рассмотрим другие факторы.

  • Понимание вывода БПФ — это то, что часто спрашивают здесь, что я написал запись в блоге. Обычно люди пытаются отслеживать высоту тона, и вы должны делать это тоже на самом деле, но есть и другие вещи, которые вы можете получить от FFT, такие как центроид частоты, и относительные силы разных частот, которые важны в речи. Начни здесь: http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html

  • Вы также можете рассмотреть возможность фильтрации важных речевых частот (чтобы узнать, что это такое, начните с записи в Википедии на «манера артикуляции». Например, перейдя по ссылке на Sibilant, вы узнаете, что «[s] обладает наибольшей акустической силой на уровне около 8000 Гц». Neeto!) Вы можете получить эту информацию из БПФ или путем фильтрации. У каждого есть свои преимущества и недостатки. Вы можете заглянуть в литературу по распознаванию речи, чтобы увидеть, что они используют.

2

Другие решения

Преобразования Фурье такие как ДПФ вернуть сложные числа, так что вы не можете их обойти.

В зависимости от вашего приложения вы может быть в состоянии безопасно игнорировать мнимую часть вашего комплексного числа и рассматривать вывод вашего ДПФ как последовательность действительных чисел.

Существует множество операций, которые вы можете выполнять с комплексными числами. Некоторые из них могут иметь отношение к вашему приложению, некоторые нет. Стоит потратить некоторое время, чтобы лучше понять сложные числа.

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

0

У меня была похожая проблема, и я отказался от использования векторного контейнера для сложных двойных чисел в c ++, так как он не очень хорошо поддерживается библиотеками FFT и в итоге использовал простой старый массив. Вы найдете большинство вещей, которые вы пытаетесь сделать, будут работать просто отлично.

 std::complex<double>*  in=new std::complex<double> [N];

Все arthmatic будет работать как с любым другим массивом, например abs(in[i]) или же in[i] *pi просто убедитесь, что вы используете C ++ версию математической библиотеки

для вашего конкретного вопроса вы должны проверить C ++ ссылка Есть реальные и IMAG-функции, которые вы можете использовать, чтобы увидеть, если он больше нуля

тогда просто убедитесь (если вы используете fftw)

использовать переинтерпретацию приведения ко всем комплексным числам (вход и выход, если они сложны)

    p = fftw_plan_dft_c2r_1d(N, reinterpret_cast<fftw_complex*>(in), out,FFTW_ESTIMATE);

fftw_execute(p);
0

DFT всегда будет использовать комплексные числа, по крайней мере, для вывода. Если вход описывает некоторый сигнал с течением времени, то выход описывает сигнал в соответствии с частотами. Каждое комплексное число может быть записано в полярная форма и затем разделить на абсолютное значение, которое обозначает амплитуду и угол, который обозначает фазу. Возможно, вам интересны амплитуды; если это так, вы захотите вычислить абсолютные значения, но все они также будут неотрицательными.

Есть вариации ДПФ, которые работают на реальных числах. дискретное косинусное преобразование приходит мне на ум в этом отношении. Не уверен, имеет ли это какое-либо применение в вашем приложении.

Заметка что есть библиотеки вроде FFTW который может вычислить DFT быстрее, чем ваш код. Даже самописец FFT возможно, стоит подумать, если ваш входной размер является степенью двойки. Но все это немного не относится к вашему актуальному вопросу.

0
По вопросам рекламы [email protected]