Функция 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.