#matlab #signal-processing #fft
#matlab #обработка сигналов #БПФ
Вопрос:
У меня есть сигнал a(t)
, вот как он выглядит, когда я его строю:
Я пытаюсь извлечь собственные частоты этого сигнала, используя FFT в MATLAB. Я делаю это так
Y=fft( a );
P2 = abs(Y/L);
P1 = P2(1:L/2 1);
P1(2:end-1) = 2*P1(2:end-1);
plot(P1)
Теперь получается, что если я использую Y=fft( a )
, я получаю только частоты, близкие к 0, когда я строю спектр. Если я использую Y=fft( a(1:3:end) )
, то я получаю частоты с 0 и ненулевыми частотами.
- Почему эти ненулевые частоты не появляются, когда я выполняю БПФ для полного набора данных, а только при выборке каждой 4-й точки?
- Действительно ли ненулевая частота содержится в моем наборе данных или это артефакт?
Комментарии:
1. Что
L
? Можете ли вы либо включить график вашего спектра, либо данные дляa
, либо способ генерацииa
?2. Принимая каждую 4-ю (на самом деле, похоже, что вы берете каждую 3-ю) точку, вы выполняете дополнительную выборку данных. Любая энергия сигнала на частотах выше newSampleRate / 2 будет уменьшена. Вы говорите, что исходный спектр показывает только энергию, близкую к нулю, но также похоже, что вы отображаете только первые L / 2 точки спектра. Я предполагаю, что L должен быть всей длиной a? Но если L меньше, это может объяснить вашу проблему. Чтобы действительно ответить на вопрос, нам потребуется дополнительная информация от вас (например, a и L).
Ответ №1:
Если вы измените ширину, которую занимает ваш набор данных для ввода БПФ, вы умножаете данные на прямоугольное окно, которое свертывает спектр с помощью функции Sinc. Результаты этой спектральной свертки будут отображаться для любых спектральных частот, которые не являются точно целочисленными периодическими в пределах новой ширины FFT.
Комментарии:
1. Да, но я думаю, что OP спрашивает о том, чтобы брать каждую 4-ю (или 3-ю, или любую другую) выборку из исходных данных. Таким образом, проблема будет связана с подвыборкой и сглаживанием, а не с окном.