Зависимые значения для БПФ падающей пилообразной формы

Я пытаюсь получить амплитуды и фазы (падающего) пилообразного сигнала. Мой зуб пилы имеет длину 1024 семпла и генерируется как

int numSamples = 1024;
for (int i = 0; i < numSamples; i++)
{
    samples[i] = -((float)i / (float)(numSamples - 1) * 2.0f - 1.0f);
}

Я устанавливаю реальный и мнимый массивы как

for (int i = 0; i < numSamples; i++)
{
    double sample = samples[i];
    re[i] = sample;
    im[i] = 0.0;
}

затем передавая его в функцию БПФ. Я считываю результат как

int numPartials = numSamples / 2;
for (int i = 1; i < numPartials; i++)
{
    outMagnitudes[i] = (float)sqrt(re[i] * re[i] + im[i] * im[i]);
    outPhases[i] = (float)atan2(im[i], re[i]);
}

возникают 2 проблемы:

  • величины только вдвое меньше, чем должны быть
  • фазы варьируются линейно от -PI / 2 для первого частичного до нуля для последнего, где я ожидаю, что все они будут равны нулю для данного сигнала

Я действительно не понимаю, что я делаю неправильно здесь.

У кого-нибудь есть идея?


person Lenny    schedule 27.04.2017    source источник


Ответы (1)


Вы печатаете только половину результата БПФ, который содержит только половину энергии, поэтому вы получаете величины половинного размера. Остальное находится в комплексно-сопряженной половине отрицательной частоты.

Ваша пилообразная форма не центрирована по кругу вокруг образца [0], поэтому есть фазовый сдвиг.

person hotpaw2    schedule 28.04.2017
comment
Что вы имеете в виду, когда говорите, что ваш зубец пилы не центрирован по кругу вокруг образца [0], поэтому есть фазовый сдвиг. ? В настоящее время скачок -1/1 находится в Sample[0]. Что случилось с этим ? Разве все гармонические синусы не должны иметь свою фазу в 0 на примере [0], чтобы произвести пилу? Например, здесь: youtube.com/watch?v=wNwJOBmqBsc Я действительно не понимаю Это... - person Lenny; 28.04.2017
comment
@Lenny подумайте, что подразумевает требование для 0-фазы: вход состоит исключительно из косинусов, то есть является симметричным. По соглашениям, которые обычно принимают библиотеки БПФ, это означает, что (используя нотацию Python) input[1:] должен быть симметричным, то есть input[1:] == reverse(input[1:]). В вашем случае пилообразный зуб должен иметь подъем и падение, например, любая масштабированная версия [0, 1, 2, 3, 2, 1] для 6-элементного ввода будет работать. (И вы можете создать версию длиной 2048 для своего случая.) - person Ahmed Fasih; 28.04.2017
comment
Это определенно сбивает с толку, связывая соглашения, используемые библиотеками БПФ, с выводами общей теории Фурье… надеюсь, мы сможем вам это разъяснить. - person Ahmed Fasih; 28.04.2017
comment
Должен признаться, я все еще в замешательстве. Причина, по которой мне это нужно, заключается в том, что у меня есть осциллятор волновой таблицы (сэмплы) и я хочу написать редактор, в котором вы можете переключаться между временной областью (1024 сэмпла) и частотной областью (512 величин и фазы). Поэтому мне нужны функции преобразования. Может ли кто-нибудь дать мне какой-нибудь псевдокод о том, как подготовить re/im для преобразования сэмплов в mag/phase и еще один, который использует mag/phase для восстановления исходных сэмплов? Я думаю, псевдокод будет легче всего понять... - person Lenny; 28.04.2017
comment
Теперь я получаю правильный магнит/фазу из сэмплов (не уверен, что делаю это точно), учитывая также и зеркальную часть ре/има, но я все еще не могу восстановить исходные сэмплы из этих... - person Lenny; 28.04.2017