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.

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

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

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 игнорирует остающиеся значения сигналов мимо nзапись th и возвращает усеченный результат. Если 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(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) основаны на библиотеке под названием [1]FFTW [2].

Ссылки

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

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

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

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

| | | |

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