fft

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

Синтаксис

Y = fft(X)
Y = fft(X,n)
Y = fft(X,n,dim)

Описание

пример

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)')

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

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)|')

Теперь, возьмите преобразование Фурье исходного, неповрежденного сигнала и получите точные амплитуды, 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)|')

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

Задайте параметры сигнала и Гауссов импульс, 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)')

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

n = 2^nextpow2(L);

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

Y = fft(X,n);

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

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

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

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

Задайте параметры сигнала с частотой дискретизации 1 кГц и длительностью сигнала 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

В целях производительности алгоритма fft позволяет вам заполнять входной параметр конечными нулями. In this case, pad each row of X with zeros so that the length of each row is the next higher power of 2 from the current length. Задают новую длину с помощью функции 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

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

свернуть все

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

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

Типы данных: удвойтесь | единственный | int8 | int16 | int32 | uint8 | uint16 | uint32 | логический
Поддержка комплексного числа: Да

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

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

Типы данных: удвойтесь | единственный | int8 | int16 | int32 | uint8 | uint16 | uint32 | логический

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

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

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

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

Типы данных: удвойтесь | единственный | int8 | int16 | int32 | uint8 | uint16 | uint32 | логический

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

свернуть все

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

Если 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 ДПФ с реальным входом требуется примерно половину времени вычисления ДПФ с комплексным входом. Однако, когда n имеет большие простые множители, различие очень мало или его нет.

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

Алгоритмы

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

Ссылки

[2] Frigo, M. и С. G. Джонсон. fftw: Адаптивная Программная архитектура для БПФа”. Продолжения Международной конференции по вопросам Акустики, Речи и Обработки сигналов. Издание 3, 1998, стр 1381-1384.

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

Смотрите также

| | | |

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

Была ли эта тема полезной?