Этот пример показывает, как выполнить адаптивное нелинейное шумоподавление путем построения и настройки модели ANFIS.
Задайте гипотетический информационный сигнал, x
, дискретизированный при 100 Гц в течение 6 секунд.
time = (0:0.01:6)'; x = sin(40./(time+0.01)); plot(time,x) title('Information Signal x') xlabel('time') ylabel('x')
Предположим, что x
не может быть измерен без сигнала интерференции, , который генерируется от другого источника шума, , определенным неизвестным нелинейным процессом.
Сгенерируйте и постройте график источника шума .
n1 = randn(size(time)); plot(time,n1) title('Noise Source n_1') xlabel('time') ylabel('n_1')
Примите, что сигнал интерференции, , который появляется в измеренном сигнале, генерируется с помощью неизвестного нелинейного уравнения:
Постройте график этой нелинейной функции как поверхности.
domain = linspace(min(n1),max(n1),20); [xx,yy] = meshgrid(domain,domain); zz = 4*sin(xx).*yy./(1+yy.^2); surf(xx,yy,zz) xlabel('n_1(k)') ylabel('n_1(k-1)') zlabel('n_2(k)') title('Unknown Interference Channel Characteristics')
Вычислите сигнал интерференции, , от источника шума, , и постройте график обоих сигналов.
n1d0 = n1; % n1 with delay 0 n1d1 = [0; n1d0(1:length(n1d0)-1)]; % n1 with delay 1 n2 = 4*sin(n1d0).*n1d1./(1+n1d1.^2); % interference subplot(2,1,1) plot(time,n1) ylabel('n_1') xlabel('time') title('Noise Source') subplot(2,1,2) plot(time,n2) ylabel('n_2') title('Interference Signal') xlabel('time')
связана с в результате сильно нелинейного процесса, показанного ранее. Однако из графиков эти два сигнала, по-видимому, никоим образом не коррелируют друг с другом.
Измеренный сигнал, m
, - сумма исходного информационного сигнала, x
, и помехи, . Однако, неизвестно. Единственными доступными сигналами являются сигнал шума, и измеренный сигнал m
.
m = x + n2; subplot(1,1,1) plot(time, m) title('Measured Signal') xlabel('time') ylabel('m')
Можно восстановить исходный информационный сигнал, x
, с использованием адаптивного шумоподавления через обучение ANFIS.
Используйте anfis
команда для идентификации нелинейных отношений между и . В то время как не доступен напрямую, можно предположить, что m
является шумной версией для обучения. Это предположение лечит x
как «шум» в этом виде нелинейного подбора кривой.
Предположим, что порядок нелинейного канала известен (в этом случае 2
). Для обучения можно использовать модель ANFIS с двумя входами.
Определите обучающие данные. Первые два столбца data
являются входами в модель ANFIS, и задержанная версия из . Итоговый столбец data
- измеренный сигнал, m
.
delayed_n1 = [0; n1(1:length(n1)-1)]; data = [delayed_n1 n1 m];
Сгенерируйте начальный объект FIS. По умолчанию алгоритм разделения сетки использует две функции принадлежности для каждой входной переменной, что создает четыре нечетких правила для обучения.
genOpt = genfisOptions('GridPartition');
inFIS = genfis(data(:,1:end-1),data(:,end),genOpt);
Настройка FIS с помощью anfis
команда с начальным размером шага обучения 0.2
.
trainOpt = anfisOptions('InitialFIS',inFIS,'InitialStepSize',0.2); outFIS = anfis(data,trainOpt);
ANFIS info: Number of nodes: 21 Number of linear parameters: 12 Number of nonlinear parameters: 12 Total number of parameters: 24 Number of training data pairs: 601 Number of checking data pairs: 0 Number of fuzzy rules: 4 Start training ANFIS ... 1 0.761817 2 0.748426 3 0.739315 4 0.733993 Step size increases to 0.220000 after epoch 5. 5 0.729492 6 0.725382 7 0.721269 8 0.717621 Step size increases to 0.242000 after epoch 9. 9 0.714474 10 0.71207 Designated epoch number reached. ANFIS training completed at epoch 10. Minimal training RMSE = 0.71207
Настроенный FIS, outFIS
, моделирует отношение второго порядка между и .
Вычислите предполагаемый сигнал помехи, estimated_n2
, путем оценки настроенного FIS с использованием исходных обучающих данных.
estimated_n2 = evalfis(outFIS,data(:,1:2));
Постройте график фактического сигнал и расчетная версия с выхода ANFIS.
subplot(2,1,1) plot(time, n2) ylabel('n_2') xlabel('time') title('Unknown Interference Signal') subplot(2,1,2) plot(time, estimated_n2) ylabel('n_2') xlabel('time') title('Estimated Interference Signal')
Оценочный информационный сигнал равен различию между измеренным сигналом, m
и предполагаемую интерференцию (выход ANFIS).
estimated_x = m - estimated_n2;
Сравните исходный информационный сигнал, x
и смета, estimated_x
.
figure plot(time,estimated_x,'b',time,x,'r') xlabel('time') ylabel('x') title('Comparison of Actual and Estimated Signals') legend('Estimated x','Actual x (unknown)','Location','SouthEast')
Без обширного обучения модель ANFIS производит реалистично точную оценку информационного сигнала.