Этот пример показывает, как сделать адаптивное нелинейное подавление помех с помощью команд genfis
и anfis
.
Задайте гипотетический информационный сигнал, x
, выбранный на уровне 100 Гц более чем 6 секунд.
time = (0:0.01:6)'; x = sin(40./(time+0.01)); plot(time,x) title('Information Signal x','fontsize',10) xlabel('time','fontsize',10) ylabel('x','fontsize',10)
Примите, что x
не может быть измерен без интерференционного сигнала, , который сгенерирован от другого источника шума, , через определенный неизвестный нелинейный процесс.
График ниже источника шума показов .
n1 = randn(size(time)); plot(time,n1) title('Noise Source n_1','fontsize',10) xlabel('time','fontsize',10) ylabel('n_1','fontsize',10)
Примите что интерференционный сигнал, , это появляется в измеренном сигнале, сгенерирован через неизвестное нелинейное уравнение:
Постройте эту нелинейную характеристику как поверхность.
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)','fontsize',10); ylabel('n_1(k-1)','fontsize',10); zlabel('n_2(k)','fontsize',10); title('Unknown Interference Channel Characteristics','fontsize',10);
Вычислите интерференционный сигнал, , от источника шума, , и постройте оба сигнала.
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('noise n_1','fontsize',10); subplot(2,1,2) plot(time,n2); ylabel('interference n_2','fontsize',10);
связан с через очень нелинейный процесс, показанный ранее; из графиков трудно видеть, коррелируются ли эти два сигнала в каком-либо случае.
Измеренный сигнал, m
, является суммой исходного информационного сигнала, x
и интерференции, . Однако мы не знаем . Единственные сигналы, доступные нам, являются шумовым сигналом, , и измеренный m
сигнала.
m = x + n2; % measured signal subplot(1,1,1) plot(time, m) title('Measured Signal','fontsize',10) xlabel('time','fontsize',10) ylabel('m','fontsize',10)
Можно восстановить исходный информационный сигнал, x
, с помощью адаптивного подавления помех через обучение ANFIS.
Используйте команду anfis
, чтобы идентифицировать нелинейное отношение между и в то время как не непосредственно доступно, можно принять, что m
является "загрязненной" версией для обучения. Это предположение обрабатывает x
как "шум" в этом виде нелинейного подбора кривой.
Примите, что порядок нелинейного канала известен (в этом случае, 2
), таким образом, можно использовать модель ANFIS с 2 входами для обучения.
Задайте данные тренировки. Первые два столбца 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 5 0.729492 Step size increases to 0.220000 after epoch 5. 6 0.725382 7 0.721269 8 0.717621 9 0.714474 Step size increases to 0.242000 after epoch 9. 10 0.71207 Designated epoch number reached --> ANFIS training completed at epoch 10. Minimal training RMSE = 0.712070
Настроенный FIS, outFIS
, моделирует отношение второго порядка между и .
Вычислите предполагаемый интерференционный сигнал, estimated_n2
, путем оценки настроенного FIS использование исходных данных тренировки.
estimated_n2 = evalfis(outFIS,data(:,1:2));
Постройте и фактический предупредите и предполагаемая версия от ANFIS вывод.
subplot(2,1,1) plot(time, n2) ylabel('n_2 (unknown)'); subplot(2,1,2) plot(time, estimated_n2) ylabel('Estimated n_2');
Предполагаемый информационный сигнал равен различию между измеренным сигналом, m
и предполагаемой интерференцией (ANFIS вывод).
estimated_x = m - estimated_n2;
Сравните исходный информационный сигнал, x
, и оценку, estimated_x
.
figure plot(time,estimated_x,'b',time,x,'r') legend('Estimated x','Actual x (unknown)','Location','SouthEast')
Без обширного обучения ANFIS производит хорошую оценку информационного сигнала.