Дискретное преобразование Фурье, или ДПФ, является основным инструментом цифровой обработки сигналов. Основой продукта является быстрое преобразование Фурье (FFT), метод вычисления ДПФ с уменьшенным временем выполнения. Многие функции тулбокса (включая частотную характеристику Z-области, спектра и cepstrum анализ, а также некоторые создания фильтра и функции реализации) включают в себя БПФ.
Окружение MATLAB ® обеспечивает функции fft
и ifft
вычислить дискретное преобразование Фурье и его обратное, соответственно. Для последовательности входа x и ее преобразованной версии X (преобразование Фурье в дискретном времени на одинаково разнесенных частотах вокруг модуля круга) две функции реализуют отношения
и
В этих уравнениях последовательные индексы начинаются с 1 вместо 0 из-за схемы индексации векторов MATLAB, и
Примечание . Соглашением MATLAB является использование отрицательного j для fft
функция. Это инженерная конвенция; физика и чистая математика обычно используют положительное j.
fft
, с одним входным параметром, x
, вычисляет ДПФ вектора или матрицы входа. Если x
является вектором, fft
вычисляет ДПФ вектора; если x
- прямоугольный массив, fft
вычисляет ДПФ каждого столбца массива.
Для примера создайте временной вектор и сигнал:
t = 0:1/100:10-1/100; % Time vector x = sin(2*pi*15*t) + sin(2*pi*40*t); % Signal
Вычислите ДПФ сигнала, величину и фазу преобразованной последовательности. Уменьшите ошибку округления при вычислении фазы путем установки значений преобразования малой амплитуды в нуль.
y = fft(x); % Compute DFT of x m = abs(y); % Magnitude y(m<1e-6) = 0; p = unwrap(angle(y)); % Phase
Чтобы построить график величины и фазы в степенях, введите следующие команды:
f = (0:length(y)-1)*100/length(y); % Frequency vector subplot(2,1,1) plot(f,m) title('Magnitude') ax = gca; ax.XTick = [15 40 60 85]; subplot(2,1,2) plot(f,p*180/pi) title('Phase') ax = gca; ax.XTick = [15 40 60 85];
Второй аргумент для fft
задает число точек n
для преобразования, представляющего длину ДПФ:
n = 512; y = fft(x,n); m = abs(y); p = unwrap(angle(y)); f = (0:length(y)-1)*100/length(y); subplot(2,1,1) plot(f,m) title('Magnitude') ax = gca; ax.XTick = [15 40 60 85]; subplot(2,1,2) plot(f,p*180/pi) title('Phase') ax = gca; ax.XTick = [15 40 60 85];
В этом случае fft
заполняет последовательность входа нулями, если она короче n
, или обрезает последовательность, если она длиннее n
. Если n
не задан, по умолчанию задается длина последовательности входа. Время выполнения для fft
зависит от длины, n
, ДПФ, который он выполняет; см. fft
Страница с описанием для получения дополнительной информации об алгоритме.
Обратите внимание , что полученная амплитуда БПФ A*n/2
, где A
- исходная амплитуда и n
количество точек БПФ. Это справедливо, только если количество точек БПФ больше или равно количеству выборок данных. Если количество точек БПФ меньше, амплитуда БПФ ниже исходной амплитуды на вышеуказанную величину.
Обратная дискретная функция преобразования Фурье ifft
также принимает последовательность входа и, необязательно, количество желаемых точек для преобразования. Попробуйте пример ниже; исходная последовательность x
и восстановленная последовательность идентичны (в пределах ошибки округления).
t = 0:1/255:1; x = sin(2*pi*120*t); y = real(ifft(fft(x))); figure plot(t,x-y)
Этот тулбокс также включает функции для двумерного БПФ и его обратной, fft2
и ifft2
. Эти функции полезны для двумерной обработки сигнала или изображения. Функция goertzel, которая является другим алгоритмом для вычисления ДПФ, также включена в тулбокс. Эта функция эффективна для вычисления ДПФ фрагмента длинного сигнала.
Иногда удобно переставлять выход fft
или fft2
Поэтому ноль частотной составляющей находится в центре последовательности. Функция fftshift
перемещает нулевую частотную составляющую к центру вектора или матрицы.