www.gusucode.com > 混沌时间序列工具箱 > 混沌时间序列工具箱/ChaosToolbox1p0_trial/Prediction_Volterra/PhaSpa2VoltCoef.m
function [Un,len_filter] = PhaSpa2VoltCoef(xn,p) % 构造 Volterra 自适应 FIR 滤波器的输入信号矢量 Un % [Un, len_filter] = PhaSpa2VoltCoef(xn, p) % 输入参数: % xn 相空间中的点序列(每一列为一个点) % p Volterra 级数阶数 % 输出参数: % Un Volterra 自适应 FIR 滤波器的输入信号矢量 Un [m,xn_cols] = size(xn); % m 为重构维数,xn_cols 为训练样本个数 Un(1,:) = ones(1,xn_cols); % FIR 滤波器的抽头输入信号矢量 Un (第一个系数为 1) h_cols_1 = 0; for k = 1:p clear h; h(1,:) = zeros(1,k); % k 阶 Volterra 核的下标 (第一个为 0,0,0... ) i = 1; % 当上一行最后一列数值达到 m-1 结束循环 while h(i,end)<m-1 i = i + 1; % 从后往前考察上一行每一列 for j = k:-1:1 % 当上一行第 j 列数值达到 m-1 时,这一行的第 1 至第 j+1 列的数值均为上一行第 j+1 列数值加 1,其余不变 if (h(i-1,j)==m-1) h(i,1:j+1) = ones(1,j+1) * (h(i-1,j+1)+1); h(i,j+2:end) = h(i-1,j+2:end); break; end % 当上一行数值都没有达到 m-1 时,这一行第 1 列数值加 1,其余不变 h(i,1) = h(i-1,1)+1; h(i,2:end) = h(i-1,2:end); end end %disp('------------------') h; % 构造 k 阶 Volterra 核的下标 h_cols_1 = [h_cols_1;h(:,1)]; index = m - h; [index_rows,index_cols] = size(index); un = zeros(index_rows,xn_cols); %for q = 1:xn_cols % vector = xn(:,q); % array = vector(index); % 从列向量中提取出x(n),x(n-tau),x(n-2*tau)... % un(:,q) = prod(array,2); % 计算x(n),x(n-tau),x(n-2*tau)...之间的乘积 %end %------------------------------------------------ % 上面是原始算法,下面是优化算法 for j = 1:index_rows xn_rows_index = index(j,:); xn_rows = xn(xn_rows_index,:); un(j,:) = prod(xn_rows,1); end Un = [Un;un]; % FIR 滤波器的抽头输入信号矢量 Un clear un; end len_filter = size(Un,1);