exponenta event banner

fft

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

Описание

пример

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

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

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

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

пример

Y = fft(X,n) возвращает значение n-точка DFT. Если значение не указано, 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-by-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 нативно вычисляется в одной точности, и 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 (j 1) (k 1) X (j) =1n∑k=1nY (k) Wn − (j − 1) (k − 1),

где

Wn = e (2οi )/n

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

Совет

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

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

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

Алгоритмы

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

Ссылки

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

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

.

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

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