logo
DSP_PC / Лабораторная работа #2

Функция fftshift

Данная функция является встроенной в MATLAB и используется при выполнении лабораторной работы.

Элементы вектора, возвращаемого функцией fft, соответствуют частотам, равномерно распределенным в диапазоне от нуля и почти до частоты дискретизации. Первый элемент, таким образом, соответствует нулевой частоте, а последующий – частоте, меньшей частоты дискретизации на fд/N, где N – размер входного и выходного векторов. При выводе спектральных графиков иногда желательно, чтобы нулевая частота находилась в центре, а диапазон отображаемых частот простирался от - fд/2 до fд/2. Сделать это позволяет функция fftshift, которая меняет местами половины переданного ей вектора:

y = fftshift (x)

Продемонстрируем действие функции fftshift на примере двух коротких векторов четной и нечетной длины:

>> fftshift([1 2 3 4 5 6 7 8 9 10])

ans =

6 7 8 9 10 1 2 3 4 5

>> fftshift([1 2 3 4 5 6 7 8 9 10 11])

ans =

7 8 9 10 11 1 2 3 4 5 6

Как видно, в случае четной длины действительно происходит перестановка половин входного вектора. В случае нечетной длины перестановка выполняется так, чтобы первый элемент, соответствующий нулевой частоте, стал средним элементом результирующего вектора.

ПРИЛОЖЕНИЕ 4.4

Пример 4.1

Вычислить модуль спектра вещественной периодической последовательности с периодом N=32 (N-четное) и центрировать его относительно дискретной нормированной частоты k=0.

Сформируем 32-точечную последовательность – вектор х и выполним расчет модуля спектра. При построении графиков будем учитывать постоянные множители

и соответствие

Выполнение пункта задания 2 на Matlab

>> N=32;

>> n=0:(N-1);

>> x=1+0.7*sin((pi*n)/32);

>> X=fft(x);

>> MOD2=(2/N)*abs(X);

>> MOD2(1)=(1/N)*abs(X(1));

Выполнение пункта задания 3 на Matlab

>> subplot(3,1,1), stem(MOD2, 'fill','MarkerSize',3),...

grid, xlabel('k'), title ('fftshift N=32 X(k), k=1,2,...,N')

>> Xs=fftshift(X);

>> MOD2s=(2/N)*abs(Xs);

>> MOD2s(N/2+1)=(1/N)*abs(Xs(N/2+1));

>> subplot(3,1,2), stem(MOD2s, 'fill','MarkerSize', 3),...

grid, title('fftshift N=32 Xs(k), k=1,2,...,N')

>> k=-N/2:N/2-1;

>> subplot(3,1,3), stem(k,MOD2s,'fill','MarkerSize',3),...

grid, xlabel('k'), title('fftshift N=32 Xs(k), k=-N/2:N/2-1')

Рис.4.4.1 Модуль спектра 32-точечной периодической вещественной последовательности: вычисленный с помощью функции fft;

смещенный с помощью функции fftshift;

центрированный относительно k=0

Пример 4.2

Для вещественной периодической последовательности х(n) с периодом N=31 (N-нечетное), вычислить и построить график модуля спектра, центрированный относительно дискретной нормированной частоты k=0.

Выполнение пункта задания 4 на Matlab

>> N=31;

>> n=0:(N-1);

>> x=1+0.7*sin((pi*n)/8);

>> X=fft(x);

>> MOD2=(2/N)*abs(X);

>> MOD2(1)=(1/N)*abs(X(1));

>> subplot(3,1,1), stem(MOD2,'fill','MarkerSize',3),...

grid, xlabel('k'), title('fftshift N=31 X(k), k=1,2,...,N')

>> Xs=fftshift(X);

>> MOD2s=(2/N)*abs(Xs);

>> MOD2s((N-1)/2+1)=(1/N)*abs(Xs((N-1)/2+1));

>> subplot(3,1,2), stem(MOD2s, 'fill','MarkerSize',3),...

grid, title('fftshift N=31 Xs(k), k=1,2,...,N')

>> k=-(N-1)/2:(N-1)/2;

>> subplot(3,1,3), stem(k,MOD2s,'fill','MarkerSize',3),...

grid, xlabel('k'), title('fftshift N=31 Xs(k), k=-(N-1)/2:(N-1)/2')

Рис.4.4.2 Модуль спектра 31-точечной периодической вещественной последовательности: вычисленный с помощью функции fft;

смещенный с помощью функции fftshift; центрированный относительно k=0.