From e365ca510f82b752ccd759421b12567e86c8d452 Mon Sep 17 00:00:00 2001 From: guolas Date: Thu, 8 Aug 2013 18:15:40 -0700 Subject: [PATCH] First commit, trying to use Cs version of printf --- complete.jl | 110 ---------------------------------------------------- prueba.jl | 50 ++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 110 deletions(-) delete mode 100644 complete.jl create mode 100644 prueba.jl diff --git a/complete.jl b/complete.jl deleted file mode 100644 index 4a572a7..0000000 --- a/complete.jl +++ /dev/null @@ -1,110 +0,0 @@ -function equal_power_assignment(W, antennas_tx, antennas_rx, p_tx_max) - number_of_bs = integer(size(W, 1) / antennas_tx) - acc_matrix = kron(eye(number_of_bs), ones(antennas_tx)).' - abs_W_2 = abs2(W) - p_range::Array{Float64} = [0, 2^5] - p_stream = p_range[2]* ones(number_of_bs * antennas_rx) - p_tx = acc_matrix * abs_W_2 * p_stream - while p_tx_max - max(p_tx) > 0 - p_range[2] = 2 * p_range[2] - p_stream = p_range[2]* ones(number_of_bs * antennas_rx) - p_tx = acc_matrix * abs_W_2 * p_stream - end - p_stream = mean(p_range) * ones(number_of_bs * antennas_rx) - p_tx = acc_matrix * abs_W_2 * p_stream - flag = check_power_condition(p_tx, p_tx_max) - while flag != 0 - if flag == 1 - p_range[2] = mean(p_range) - else - p_range[1] = mean(p_range) - end - p_stream = mean(p_range) * ones(number_of_bs * antennas_rx) - p_tx = acc_matrix * abs_W_2 * p_stream - flag = check_power_condition(p_tx, p_tx_max) - end - return mean(p_range) -end - -function check_power_condition(p_tx, p_tx_max) - if sum(p_tx .> p_tx_max) == 0 - if (p_tx_max - max(p_tx)) < 1e-3 - flag = 0 - else - flag = -1 - end - else - flag = 1 - end - return flag -end - -function zf_precoding(H) - return pinv(H) -end - -function bd_precoding(H, antennas_tx, antennas_rx) - number_of_bs = integer(size(H, 2) / antennas_tx) - number_of_ms = integer(size(H, 1) / antennas_rx) - W_bd = im * zeros(number_of_bs * antennas_tx, number_of_bs * antennas_rx) - S_bd = im * zeros(number_of_ms * antennas_rx) - U_bd = im * zeros(number_of_ms * antennas_rx, number_of_ms * antennas_rx) - for ii in 1:number_of_bs - rows_to_remove = [(ii - 1) * antennas_rx + 1: ii * antennas_rx] - H_tilde = remove_rows(H, rows_to_remove) - (U, S, V) = svd(H_tilde, false) - rank_H_tilde = sum(S .> eps(1.0)) - V_tilde_0 = V[:, rank_H_tilde + 1:end] - (U, S, V) = svd(H[rows_to_remove, :] * V_tilde_0, false) - V_1 = V[:, 1:antennas_rx] - W_bd[:, rows_to_remove] = V_tilde_0 * V_1 - S_bd[rows_to_remove] = S[1:antennas_rx] - U_bd[rows_to_remove, rows_to_remove] = U - end - return (W_bd, real(S_bd), U_bd) -end - -function remove_rows(matrix, row_idx) - row_idx = sort(row_idx, rev = true) - rows = 1:size(matrix, 1) - for ii in row_idx - new_rows = [1:ii-1, ii+1:size(matrix,1)] - matrix = matrix[new_rows, :] - end - return matrix -end - -function get_channel_matrix(number_of_bs, tx_antennas, rx_antennas, users_per_cell = 1) - number_of_bs = integer(number_of_bs) - number_rows = number_of_bs * users_per_cell * rx_antennas - number_cols = number_of_bs * tx_antennas - channel_matrix = sqrt(1 / 2) * (randn(number_rows, number_cols) + im * randn(number_rows, number_cols)) - return channel_matrix -end - -#------------------------------ -number_of_bs = 10 -antennas_tx = 4 -antennas_rx = 2 -p_max = 10000.0 -SNR = 5.0 -sigma_n = p_max/10^(SNR/10) - -pb_acc = kron(eye(number_of_bs), ones(antennas_tx)).' - -H = get_channel_matrix(number_of_bs, antennas_tx, antennas_rx) - -tic() -for ii in 1:1e4 - # BD - W_bd, S, U = bd_precoding(H, antennas_tx, antennas_rx) - p_tx_bd = equal_power_assignment(W_bd, antennas_tx, antennas_rx, p_max) - - stream_rate_bd = log2(1 + p_tx_bd .* S / sigma_n) - - # ZF - W_zf = zf_precoding(H) - p_tx_zf = equal_power_assignment(W_zf, antennas_tx, antennas_rx, p_max) - stream_rate_zf = log2(1 + p_tx_zf * ones(number_of_bs * antennas_rx) / sigma_n) -end -toc() \ No newline at end of file diff --git a/prueba.jl b/prueba.jl new file mode 100644 index 0000000..1fa210c --- /dev/null +++ b/prueba.jl @@ -0,0 +1,50 @@ +module prueba +using Base.Grisu +export @printf, @sprintf + +### external printf interface ### + +_is_str_expr(ex) = +isa(ex,Expr) && ex.head==:macrocall && isa(ex.args[1],Symbol) && +(ex.args[1] == :str || endswith(string(ex.args[1]),"_str")) + +macro printf(args...) + if length(args) == 0 + error("@printf: called with zero arguments") + end + if !isa(args[1],String) && !(length(args) > 1 && isa(args[2],String)) + if _is_str_expr(args[1]) || length(args) > 1 && _is_str_expr(args[2]) + error("format must be a plain static string (no interpolation or prefix)") + end + error("first or second argument must be a format string") + end + local io, fmt + if isa(args[1],String) + io = :(Base.STDOUT) + args = args[1:] + else + io = args[1] + args = args[2:] + end + args_type = typeof(args) + at = Expr(:tuple) + at.args = Array(Any,length(args_type)) + at.args[1] = Expr(:curly) + at.args[1].args = Array(Any, 2) + at.args[1].args[1] = :Ptr + at.args[1].args[2] = :Uint8 + for ii in 2:length(args_type) + at.args[ii] = symbol("$(args_type[ii])") + end + +# ex = :(ccall( (:printf, "libc"), Int32, $at, $(args...)) ) +# eval(ex) + + return args_type, args, at +end + +macro sprintf(args...) + :(sprint(io->@printf(io,$(map(esc,args)...)))) +end + +end # module