
3.2. Вычисление дпф с помощью пакета matlab
В MATLAB вычисление ДПФ выполняется на основе БПФ и ОБПФ с помощью соответствующих функций:
X=fft(x)
x=ifft(X)
где:
х – N-точечная последовательность; в общем случае это вектор комплексных чисел;
X – N-точечное ДПФ; в общем случае это вектор комплексных чисел.
В MATLAB нижняя граница элементов массива равна единице, соответствие между элементами последовательностей x(n) и X(k) в (3.3.1) - (3.3.2), с одной стороны, и элементами векторов x и X в функциях fft и ifft, с другой будет следующим:
(3.3.1)
Это рекомендуется учитывать при построении в Matlab графиков последовательностей x(n), а так же модулей и аргументов ДПФ X(k).
Пример использования функций fft и ifft:
Задана N-точечная последовательность – вектор х. Вычислить N-точечное ДПФ – вектор Х – и убедиться во взаимной однозначности формул (3.3.1) - (3.3.2):
>> x=[1 2 3 4 5 6 7 8];
>> X=fft(x);
>> x=ifft(X)
x = 1 2 3 4 5 6 7 8
Рассчитанная с помощью ОДПФ последовательность совпала с исходной.
3.2.1. Внешняя функция fft_e1
Создание
внешней функции fft_e1,
для выбора значений ДПФ |X(k)|,
которые, согласно критерию
,
относятся к сигналу:
Function-файлом называют создаваемый пользователем M-файл, представляющий собой внешнюю функцию.
По существу, внешняя функция – это подпрограмма, к которой можно обратиться из script-файла или непосредственно в режиме прямых вычислений.
Выполнение пункта задания 2 на Matlab:
% Определение значений модуля ДПФ, соответствующих сигналу
% е1 - заданный порог
% NX - длина ДПФ
% MODX - вектор значений модуля ДПФ
% MODm - вектор значений модуля ДПФ, соответствующих сигналу
% m - вектор значений частот, соответствующих MODm
% Цикл для определения векторов MODm и m
i=1;
MAX=max(MODX);
for k=1:NX
if (MODX(k)/MAX)>e1
MODm(i)=MODX(k);
m(i)=k;
i=i+1;
end
end
ПРИЛОЖЕНИЕ 3.4
Пример 3.1.
Вычислить модуль спектра вещественной периодической последовательности:
x(n) = 0.7sin(2πf1nT) + 0.5sin(2πf2nT) (3.4.1)
с периодом N=1024 и следующими значениями частот:
частота дискретизации fд=2000 Гц (период дискретизации T=1/2000 с);
f1 = 500 Гц;
f2 = 750 Гц.
Запишем последовательность x(n) (3.4.1), подставив исходные данные:
Сформируем 1024-точечную последовательность – вектор х – и выполним расчет модуля спектра на основе ДПФ с учетом постоянных множителей.
Выполнение пункта задания 3 на Matlab
>> N=1024; n=0:(N-1);
>> x=0.7*sin(0.5*pi.*n)+0.5*sin(0.75*pi.*n);
>> X=fft(x);
>> MOD=(2/N)*abs(X); MOD(1)=(1/N)*abs(X(1));
>> k=0:(N-1);
Выполнение пункта задания 4 на Matlab
Построим график модуля спектра 1024-точечной периодической вещественной последовательности (рис. 3.4.1)
>> stem (k,MOD,'fill','MarkerSize',5), grid, xlabel('k'), title('fft N=1024')
Рис. 3.4.1. Модуль спектра 1024-точечной периодической вещественной последовательности
Для определения значений дискретных нормированных частот k, соответствующим гармоникам с амплитудами 0.7 и 0.5 (Рис.3.4.1), воспользуемся внешней функцией fft_e1. В данном случае шум отсутствует, поэтому значение порога ε1 можно выбрать малым, сравнимым с нулем, например, ε1=10-7:
Выполнение пункта задания 5 на Matlab
e1=1e-7;
[MODm,m]=fft_e1(N,MOD,e1)
MODm =
0.7000 0.5000 0.5000 0.7000
m =
257 385 641 769
Пример 3. 2
Вычислить спектральную плотность 1024-точечной последовательности, представляющей собой смесь вещественной периодической последовательности x(n) с нормальным белым шумом. Построить графики последовательности и модуля ее спектральной плотности.
Сформируем 1024-точечную последовательность (вектор s) – сумму последовательности x(n) (3.4.1) (вектора х) и нормального белого шума (вектора noise).
Выполнение пункта задания 6 на Matlab
>> N=1024; n=0:(N-1);
>> x=0.7*sin(0.5*pi.*n)+0.5*sin(0.75*pi.*n);
>> noise=randn(1,length(x));
>> s=x+noise;
>> subplot(2,1,1), stem(n,s,'MarkerSize',3), grid, xlabel('n'), title ('s=x+rand N=1024')
Вычислим модуль спектральной плотности на основе ДПФ с учетом постоянных множителей.
Выполнение пункта задания 7 на Matlab
>> S=fft(s);
>> MODS=(2/N)*abs(S); MODS(1)=(1/N)*abs(S(1));
>> k=0:(N-1);
>> subplot(2,1,2), stem(k,MODS, 'MarkerSize',3), grid, xlabel('k'), title('fft N=1024')
Для определения значений дискретных нормированных частот k, соответствующих гармоникам сигнала (рис. 3.4.2), можно воспользоваться внешней функцией fft_e1.
При использовании функции fft_e1 значение порога ε1 следует выбирать из условия:
При обработке реальных сигналов значение ε1, как правило, задается и зависит от конкретной задачи. Для обоснованного выбора ε1 в данном примере вычисляется числитель и знаменатель – MAX_NOISE и MAXS – и находится их отношение:
Рис. 3.4.2. 1024-точечная последовательность – смесь вещественной периодической последовательности с нормальным белым шумом и модуль ее спектральной плотности.
Выполнение пункта задания 8 на Matlab
>> NOISE=fft(noise);
>> MODNOISE=(2/N)*abs(NOISE); MODNOISE(1)=(1/N)*abs(NOISE(1));
>> MAX_NOISE=max(MODNOISE);
>> MAXS=max(MODS)
>> [MAX_NOISE MAXS MAX_NOISE/MAXS]
ans =
0.1659 0.7514 0.2208
Таким образом, диапазон возможных значений ε1 равен:
0.2207< ε1<1.
Выберем ε1=0.5 и определим амплитуды и частоты гармоник, которые, относятся к сигналу:
Выполнение пункта задания 9 на Matlab
>> e1=0.5;
>> [MODm,m]=fft_e1(N,MODS,e1)
MODm =
0.7514 0.4879 0.4879 0.7514
m =
257 385 641 769
Получились значения k1 и k2, такие же, как в примере 3.1.