2013-02-26 3 views
1

Я разрабатываю небольшое программное обеспечение в .NET, которое принимает сигнал от датчика в реальном времени и принимает БПФ этого сигнала, который также отображается в реальном времени.Почему в FFT-выходе синусоидальной волны 1 Гц величина 1 Гц ведет себя как синусоидальная волна?

Я использовал библиотеку alglib для функции FFT. Теперь моя цель - наблюдать интенсивность определенной частоты во времени.

Чтобы проверить программное обеспечение, я подал на его вход синусоидальную волну с частотой 1 Гц. На следующем рисунке показан снимок экрана из программного обеспечения. Верхний график показывает спектр частот, показывающий пик с частотой 1 Гц. Однако, когда этот пик наблюдается во времени, как показано на более низком графике, интенсивность ведет себя как синусоидальная волна.

enter image description here

Моя частота дискретизации 30 кГц. Я не понимаю, как я получаю этот синусоидальный сигнал и почему частота таких колебаний ведет себя так?

+0

Возможно ли, что в качестве сигнала 1 Гц, и я беру выборку на частоте 30 кГц с FFT для каждого набора из 30000 точек данных, поэтому эта частота слишком низкая, чтобы эта настройка была правильно измерена? – Xichan

+1

Обратный БПФ одного пикового спектра * всегда должен быть синусом. Что вы ожидали увидеть? – Junuxx

+0

@Junuxx Я ничего не говорю об обратном БПФ. Мне просто интересно узнать о величине, которая меняется во времени как синусоидальная волна. – Xichan

ответ

3

Это пример эффектов Windowing. Это происходит из-за того, что FFT - это , а не - точная операция, за исключением случаев, когда речь идет о совершенно периодических сигналах. Когда вы закроете свой сигнал, вы превратите его в меньший кусок, который может не повторите отлично. Алгоритм FFT вычисляет спектр этого кусок звука, повторяющийся бесконечно. Поскольку это не идеальная синусоидальная волна, вы не получите точное значение для результата. Кроме того, мы можем видеть, что если ваше окно не выстраивается идеально с кратным вашей частоте сигнала, то это будет сдвиг фазы по отношению к вашему сигналу, окно, захватывающее немного другой фрагмент вашего сигнала, и FFT, вычисляющий спектр различный бесконечно повторяющийся сигнал. Если вы подумаете об этом, эта разность фаз будет, естественно, периодической, так как окно догоняет со следующим периодом вашего сигнала.

Однако это объясняет лишь небольшие изменения интенсивности. Предполагая, что вы использовали правильные метки на осях нижнего графика (что-то нужно дважды проверить), что-то еще не так. Окно может быть слишком маленьким (хотя я этого не ожидаю, потому что тогда вы увидите больше спектрального кровотечения). Еще одна возможность, которая мне пришла в голову, заключается в том, что вы можете просто нарисовать реальную часть БПФ, а не величина. По мере изменения фазы реальные и сложные части могут отличаться, но вы ожидаете, что величина останется примерно такой же.

+0

Спасибо за ваш ответ. Я только что проверил, и я заметил, что из всего синусоидального сигнала, который колеблется от -10 до +10, первое окно имеет только данные от 0 до 2. Это означает, что только 10% синусоидальной волны, которую БПФ входит в окно. Также я проверил, что xaxis на нижнем графике имеет точные метки. Каждая точка показывает значение FFT для частоты 1 Гц. – Xichan

+0

Im, использующий Alglib для FFT, и я рассчитываю такую ​​величину: 'alglib.fftr1d (данные, out fft1); двойной [] величина = новый двойной [fft1.Length]; для (int i = 0; i Xichan

+0

Я увеличил масштаб до верхнего графа. Ось X и Y была масштабирована ранее, теперь, по-моему, только ось Y масштабируется. Обратите внимание на разницу величин в следующих двух изображениях, скриншоты графиков в два момента. [ссылка] (http://www.dumpyourphoto.com/files7/206091/hpFOd8x1gL.jpg) [ссылка] (http://www.dumpyourphoto.com/files7/206092/fbHhop.jpg) – Xichan