www.gusucode.com > 无线通信FPGA设计源码程序 > 无线通信FPGA设计源码程序/matlab代码/matlab/c11/WHT.m

    function y = WHT(x_in, n)
% x 输入向量,列向量
% n 即Walsh-Hardma变换的点数,必须是2的幂次方
% alpha 即重叠保留的因子,在我们的方案中alpha = 2
% y 输出向量
% alpha=2;

alpha=2;

% 判断输入参数n
n1 = log2(n);
n2 = mod(n1,1);
if (n2 ~= 0)
    error('wht.m模块的输入参数n必须是2的幂次方');
end 

% 输入向量应该是一个列向量
% 判断输入向量x是行向量还是列向量
[a , b] = size(x_in);
if (a>1)
    x = x_in;
else
    x = x_in.'; % 注意.'是转置,'是共轭转置
end

y = zeros(length(x),1);

%% 构成[n*2n]的Walsh-Hardma变换矩阵
% [n*n]的Walsh-Hardma变换矩阵
W = zeros(n,n);
W(1,1) = 1;
for t = 1 : n1  % t 的标记单位是log2(n)
    for i = 1 : n
        for j = 1 : n
            if (i <= 2^(t-1) && j <= 2^(t-1))
                W(i ,j) = W(i ,j);
            elseif (i <= 2^(t-1) && j > 2^(t-1))
                W(i ,j) = W (i , j-2^(t-1));
            elseif (i > 2^(t-1) && j <= 2^(t-1))
                W(i ,j) = W (i-2^(t-1) , j);
            else
                W(i ,j) = -W (i-2^(t-1) , j-2^(t-1));
            end     
        end
    end   
end
% 构成[n*2n]的Walsh-Hardma变换矩阵
W1 = zeros(n,2*n);
for i1 = 1 : n
    W1(i1,1:n) = W(i1,:);
    W1(i1,n+1:2*n) = W(i1,:);   
end

%% 生成变换向量 x1 
len = n*2;
x1 = zeros(len, 1);

tlen = length(x) / n;

for i = 1:tlen
    if (i == 1)
        for i1 = 1 : n/2
            x1(i1, 1) = 0;
        end
        x1(n/2+1:1.5*n,1) = x((i-1)*n+1:i*n,1);
        x1((1.5*n+1):2*n,1) = x((i*n+1):(i*n+0.5*n),1);
    elseif (i < tlen )
        x1(1:2*n) = x((i-1)*n+1-n/2:i*n+n/2,1);
    else
        x1(1:1.5*n) = x((i-1)*n+1-n/2:i*n,1);
        for i1 = 1.5*n+1 : 2*n
            x1(i1, 1) = 0;
        end
    end
    		y((i-1)*n+1:i*n,1) = W1*x1;        
end