fft

Быстрое преобразование Фурье

Описание

пример

Y = fft(X) вычисляет дискретное преобразование Фурье (DFT) X использование быстрого алгоритма преобразования Фурье (FFT).

  • Если X является вектором, тогда fft(X) возвращает преобразование Фурье вектора.

  • Если X является матрицей, тогда fft(X) обрабатывает столбцы X как векторы и возвраты преобразование Фурье каждого столбца.

  • Если X является многомерным массивом, затем fft(X) обрабатывает значения первого измерения массива, размер которого не равен 1, как векторы и возвращает преобразование Фурье каждого вектора.

пример

Y = fft(X,n) возвращает n-точка ДПФ. Если значение не задано, Y - тот же размер, что и X.

  • Если X - вектор и длина X меньше n, затем X заполнен конечными нулями до длины n.

  • Если X - вектор и длина X больше n, затем X обрезается до длины n.

  • Если X является матрицей, затем каждый столбец обрабатывается как в вектор случае.

  • Если X является многомерным массивом, затем первое измерение массива, размер которого не равен 1, обрабатывается как в вектор случае.

пример

Y = fft(X,n,dim) возвращает преобразование Фурье вдоль размерности dim. Для примера, если X является матрицей, тогда fft(X,n,2) возвращает n значений преобразование Фурье каждой строки.

Примеры

свернуть все

Используйте преобразования Фурье, чтобы найти частотные составляющие сигнала, зарытого в шум.

Задайте параметры сигнала с частотой дискретизации 1 кГц и длительностью сигнала 1,5 секунды.

Fs = 1000;            % Sampling frequency                    
T = 1/Fs;             % Sampling period       
L = 1500;             % Length of signal
t = (0:L-1)*T;        % Time vector

Сформировать сигнал, содержащий синусоиду 50 Гц амплитуды 0,7 и синусоиду 120 Гц амплитуды 1.

S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);

Повреждите сигнал с нулевым средним белым шумом с отклонением 4.

X = S + 2*randn(size(t));

Постройте график сигнала с шумом в временной интервал. Трудно идентифицировать частотные составляющие, посмотрев на сигнал X(t).

plot(1000*t(1:50),X(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('t (milliseconds)')
ylabel('X(t)')

Figure contains an axes. The axes with title Signal Corrupted with Zero-Mean Random Noise contains an object of type line.

Вычислите преобразование Фурье сигнала.

Y = fft(X);

Вычислите двусторонний спектр P2. Затем вычислите односторонний спектр P1 на основе P2 и четную длину сигнала L.

P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

Определите частотный диапазон f и постройте график одностороннего амплитудного спектра P1. Амплитуды находятся не точно в 0,7 и 1, как и ожидалось, из-за добавленного шума. В среднем более длинные сигналы дают лучшие частотные приближения.

f = Fs*(0:(L/2))/L;
plot(f,P1) 
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

Figure contains an axes. The axes with title Single-Sided Amplitude Spectrum of X(t) contains an object of type line.

Теперь возьмем преобразование Фурье исходного, некорректированного сигнала и получим точные амплитуды, 0,7 и 1,0.

Y = fft(S);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

plot(f,P1) 
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')

Figure contains an axes. The axes with title Single-Sided Amplitude Spectrum of S(t) contains an object of type line.

Преобразуйте Гауссов импульс из временного интервала в частотный диапазон.

Задайте параметры сигнала и Гауссов импульс, X.

Fs = 100;           % Sampling frequency
t = -0.5:1/Fs:0.5;  % Time vector 
L = length(t);      % Signal length

X = 1/(4*sqrt(2*pi*0.01))*(exp(-t.^2/(2*0.01)));

Постройте график импульса во временном интервале.

plot(t,X)
title('Gaussian Pulse in Time Domain')
xlabel('Time (t)')
ylabel('X(t)')

Figure contains an axes. The axes with title Gaussian Pulse in Time Domain contains an object of type line.

Как использовать fft функция для преобразования сигнала в частотный диапазон, сначала идентифицируйте новую длину входа, которая является степенью 2 от исходной длины сигнала. Это заполнит сигнал X с конечными нулями в порядок улучшить эффективность fft.

n = 2^nextpow2(L);

Преобразуйте Гауссов импульс в частотный диапазон.

Y = fft(X,n);

Задайте частотный диапазон и постройте график уникальных частот.

f = Fs*(0:(n/2))/n;
P = abs(Y/n).^2;

plot(f,P(1:n/2+1)) 
title('Gaussian Pulse in Frequency Domain')
xlabel('Frequency (f)')
ylabel('|P(f)|^2')

Figure contains an axes. The axes with title Gaussian Pulse in Frequency Domain contains an object of type line.

Сравните косинусоидные волны в временной интервал и частотный диапазон.

Задайте параметры сигнала с частотой дискретизации 1kHz и длительностью сигнала 1 секунду.

Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sampling period
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector

Создайте матрицу, где каждая строка представляет косинусоидную волну с масштабированной частотой. Результат, X, является матрицей 3 на 1000. Первая строка имеет частоту волны 50, вторая строка имеет частоту волны 150, а третья строка имеет частоту волны 300.

x1 = cos(2*pi*50*t);          % First row wave
x2 = cos(2*pi*150*t);         % Second row wave
x3 = cos(2*pi*300*t);         % Third row wave

X = [x1; x2; x3];

Вывод первых 100 значений из каждой строки X в одной фигуре по порядку и сравните их частоты.

for i = 1:3
    subplot(3,1,i)
    plot(t(1:100),X(i,1:100))
    title(['Row ',num2str(i),' in the Time Domain'])
end

Figure contains 3 axes. Axes 1 with title Row 1 in the Time Domain contains an object of type line. Axes 2 with title Row 2 in the Time Domain contains an object of type line. Axes 3 with title Row 3 in the Time Domain contains an object of type line.

В целях эффективности алгоритма fft позволяет дополнить вход конечными нулями. В этом случае дополните каждую строку X с нулями так, чтобы длина каждой строки была следующим более высоким значением степени 2 от текущей длины. Определите новую длину с помощью nextpow2 функция.

n = 2^nextpow2(L);

Задайте dim аргумент для использования fft вдоль строк X, то есть для каждого сигнала.

dim = 2;

Вычислите преобразование Фурье сигналов.

Y = fft(X,n,dim);

Вычислите двусторонний спектр и односторонний спектр каждого сигнала.

P2 = abs(Y/L);
P1 = P2(:,1:n/2+1);
P1(:,2:end-1) = 2*P1(:,2:end-1);

На частотный диапазон постройте график одностороннего амплитудного спектра для каждой строки на одной фигуре.

for i=1:3
    subplot(3,1,i)
    plot(0:(Fs/n):(Fs/2-Fs/n),P1(i,1:n/2))
    title(['Row ',num2str(i),' in the Frequency Domain'])
end

Figure contains 3 axes. Axes 1 with title Row 1 in the Frequency Domain contains an object of type line. Axes 2 with title Row 2 in the Frequency Domain contains an object of type line. Axes 3 with title Row 3 in the Frequency Domain contains an object of type line.

Входные параметры

свернуть все

Входной массив, заданный как векторный, матричный или многомерный массив.

Если X - пустая матрица 0 на 0, затем fft(X) возвращает пустую матрицу 0 на 0.

Типы данных: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical
Поддержка комплексного числа: Да

Длина преобразования, заданная как [] или неотрицательный целочисленный скаляр. Установка положительного целочисленного скаляра для длины преобразования может увеличить эффективность fft. Длина обычно задается как степень 2 или значение, которое может быть факторизовано в продукт малых простых чисел. Если n меньше длины сигнала, тогда fft игнорирует оставшиеся значения сигналов за nth и возвращает усеченный результат. Если n является 0, затем fft возвращает пустую матрицу.

Пример: n = 2^nextpow2(size(X,1))

Типы данных: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

Размерность для работы, заданная как положительный целочисленный скаляр Если значение не задано, то по умолчанию это первое измерение массива, не равный 1.

  • fft(X,[],1) действует вдоль столбцов X и возвращает преобразование Фурье каждого столбца.

  • fft(X,[],2) действует вдоль строк X и возвращает преобразование Фурье каждой строки.

Если dim больше ndims(X), затем fft(X,[],dim) возвращает X. Когда n задан, fft(X,n,dim) заполняет или обрезает X по длине n вдоль размерной dim.

Типы данных: double | single | int8 | int16 | int32 | uint8 | uint16 | uint32 | logical

Выходные аргументы

свернуть все

Представление частотного диапазона возвращено в виде векторного, матричного или многомерного массива.

Если X имеет тип single, затем fft natival вычисляет в одинарной точности и Y также относится к типу single. В противном случае Y возвращается как тип double.

Размер Y является следующим:

  • Для Y = fft(X) или Y = fft(X,[],dim), размер Y равен размеру X.

  • Для Y = fft(X,n,dim), значение size(Y,dim) равно n, в то время как размер всех других размерностей остается таким же, как и в X.

Если X тогда реально Y сопряженная симметрия и количество уникальных точек в Y является ceil((n+1)/2).

Типы данных: double | single

Подробнее о

свернуть все

Дискретное Преобразование Фурье вектора

Y = fft(X) и X = ifft(Y) реализуйте преобразование Фурье и обратное преобразование Фурье, соответственно. Для X и Y длины nэти преобразования определяются следующим образом:

Y(k)=j=1nX(j)Wn(j1)(k1)X(j)=1nk=1nY(k)Wn(j1)(k1),

где

Wn=e(2πi)/n

является одним из n корней единства.

Совет

  • Время выполнения для fft зависит от длины преобразования. Длины преобразования, которые имеют только малые простые множители, значительно быстрее, чем те, которые являются простыми или имеют большие простые множители.

  • Для большинства значений nДПФ с реальным входом требуется примерно половину времени расчета ДПФ с комплексным входом. Однако, когда n имеет большие простые множители, разность оборотов мало или его нет.

  • Вы потенциально можете увеличить скорость fft используя служебную функцию, fftw. Эта функция управляет оптимизацией алгоритма, используемого для вычисления БПФ определенного размера и размерности.

Алгоритмы

Функции БПФ (fft, fft2, fftn, ifft, ifft2, ifftn) основаны на библиотеке, называемой FFTW [1] [2].

Ссылки

[2] Фриго, М. и С. Г. Джонсон. FFTW: адаптивная программная архитектура для БПФ. Материалы Международной конференции по акустике, речи и обработке сигналов. Том 3, 1998, с. 1381-1384.

Расширенные возможности

.

Генерация кода GPU
Сгенерируйте код CUDA ® для графических процессоров NVIDIA ® с помощью GPU Coder™

.
Представлено до R2006a