Зачем нужна маска при выполнении быстрого преобразования Фурье? - PullRequest
2 голосов
/ 15 апреля 2019

Я пытаюсь выяснить пиковые частоты, скрытые в моих данных, используя метод fft () в R. При подготовке данных более опытный пользователь рекомендует создать «маску» (подробнее после объяснения деталей),это дает мне точную диаграмму, которую я ищу.Проблема в том, что я не понимаю, что он делает или зачем он нужен.

Чтобы дать некоторый контекст, я работаю с файлами .txt, каждый из которых содержит около 12000 записей.Это информация о напряжении и времени, и ожидаемый результат - просто синусоидальная волна с четкой пиковой частотой, которая должна быть близка к 1-2 Гц.Вот пример того, как выглядит один из этих файлов:

My plotted data

Я пытался использовать метод быстрого преобразования Фурье fft (), реализованный в R, чтобы найти пикчастот и получить диаграмму, которая четко их отражала.Сначала я вычисляю некоторые вещи, которые, как я понимаю, будут полезны, такие как частота Найквиста и диапазон частот, которые я покажу на последнем графике:

    n = length(variable)
dt = time[5]-time[4] 
df = 1/(max(time))  #Find out the "unit" frequency
fnyquist = 1/(2*dt) #The Nyquist frequency
    f = seq(-fnyquist, fnyquist-df, by=df) #These are the frequencies I'll plot

Но когда я нанесу абсолютное значениеиз того, что FFT (данные) вычисляет в зависимости от диапазона частот, я получаю это:

abs(fft(data)) vs. frequency

Пиковая частота, кажется, близка к 50 Гц, но я знаю, что это недело.Это должно быть близко к 1 Гц.Я полный новичок в R и в анализе Фурье, поэтому после небольшого исследования я обнаружил на швейцарской странице , что это можно решить, создав «маску», которая на самом деле является просто вектором сповторяющийся образец (1, -1, 1, -1 ...) той же длины, что и сам мой вектор данных:

    mask=rep(c(1, -1),length.out=n)

Затем, если я умножу свой вектор данных на эту маску и нанесу результаты:

    results = mask*data
    plot(f,abs(fft(results)),type="h")

Я получаю то, что искал.(Это график после ограничения оси X разумным масштабом).Right frequency diagram!

Итак, что же на самом деле делает маска?Я понимаю, что это изменяет мои знаки точек данных альтернативным способом, но я не понимаю, почему бы это взяло пиковые частоты выведенного сигнала от ~ 50 Гц до правильного результата ~ 1 Гц.

Заранее спасибо!

1 Ответ

3 голосов
/ 15 апреля 2019

Ваша «маска» - это один из двух способов выполнения fftshift, который обычно делается для центрирования выходного сигнала БПФ с частотой 0 Гц в середине графика или графика (вместо левого края, с отрицательными частотами). оборачиваясь к правому краю).

Чтобы выполнить сдвиг fftshift, вы можете гетродинировать или модулировать свои данные (с помощью Fs / 2) до FFT, или просто сделать круговое смещение на 50% после FFT. Оба дают одинаковый результат. Они одинаковы из-за свойства смещения DFT.

...