Commit 1296c0a8eb92ef35e22678fc9e55cf79a3175c79
1 parent
5597cf6c
Exists in
master
Polish versions of the scripts
Showing
6 changed files
with
455 additions
and
18 deletions
Show diff stats
No preview for this file type
No preview for this file type
| ... | ... | @@ -0,0 +1,129 @@ |
| 1 | +#' Interference values | |
| 2 | +#' | |
| 3 | +#' Simulation of interference values at times t. Using the simple formula derived | |
| 4 | +#' analytically. | |
| 5 | +#' | |
| 6 | +#' @param t numerical vector | |
| 7 | +#' @param pc 1/switching frequency | |
| 8 | +#' @param duty duty cycle | |
| 9 | +#' @param t0 a numerical vector of initial starts ( assumed to be U(-pc, 0) ) | |
| 10 | +#' | |
| 11 | +#' @return a numerical vector of values of interference at times t | |
| 12 | +#' @export | |
| 13 | +#' | |
| 14 | +#' @examples | |
| 15 | +Simulation <- function(t, pc, duty, t0, Np, A, f, lambda) { | |
| 16 | + | |
| 17 | + ii <- (seq_len(Np) - 1) * pc | |
| 18 | + | |
| 19 | + # Calculated parameters. | |
| 20 | + A1 <- purrr::map_dbl(t0, function(.t0) sum( cos(2 * pi * f * (ii - .t0)) * exp(-lambda * (ii - .t0)) )) | |
| 21 | + B1 <- purrr::map_dbl(t0, function(.t0) sum( sin(2 * pi * f * (ii - .t0)) * exp(-lambda * (ii - .t0)) )) | |
| 22 | + A2 <- purrr::map_dbl(t0, function(.t0) sum( cos(2 * pi * f * (ii - duty * pc - .t0)) * exp(-lambda * (ii - duty * pc - .t0)) )) | |
| 23 | + B2 <- purrr::map_dbl(t0, function(.t0) sum( sin(2 * pi * f * (ii - duty * pc - .t0)) * exp(-lambda * (ii - duty * pc - .t0)) )) | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + y <- vector(mode = "numeric", length = length(t)) | |
| 28 | + for(nk in seq_along(t0)) { | |
| 29 | + # From the reduced equation | |
| 30 | + t1 <- t - floor((t - t0[nk]) / pc) * pc | |
| 31 | + t2 <- t - floor((t - duty * pc - t0[nk]) / pc) * pc | |
| 32 | + C1 <- A * exp(-lambda * (t1)) | |
| 33 | + C2 <- A * exp(-lambda * (t2)) | |
| 34 | + f1 <- C1 * (A1[nk] * sin(2 * pi * f * (t1)) + B1[nk] * cos(2 * pi * f * (t1))) | |
| 35 | + f2 <- C2 * (A2[nk] * sin(2 * pi * f * (t2)) + B2[nk] * cos(2 * pi * f * (t2))) | |
| 36 | + y <- y + f1 - f2 | |
| 37 | + } | |
| 38 | + return(y) | |
| 39 | +} | |
| 40 | + | |
| 41 | +# Assuming that t0 depicts the only the moments before the first bit sent. | |
| 42 | +SimulationNormal <- function(t, pc, duty, t0, Np, FunInter) { | |
| 43 | + | |
| 44 | + t1 <- purrr::map(t0, function(.t1) .t1 + seq(-2 * Np - 1, ceiling(max(t) / pc)) * pc) | |
| 45 | + t1 <- sort(purr::flatten_dbl(t1)) | |
| 46 | + | |
| 47 | + KierWsp <- c("+" = 1, "-" = -1) | |
| 48 | + KierV <- c("+" = 0, "-" = 1) | |
| 49 | + | |
| 50 | + y <- vector(mode = "numeric", length = length(t)) | |
| 51 | + for(.t1 in t1) { | |
| 52 | + for(kier in c("+", "-")) { | |
| 53 | + y <- y + KierWsp[kier] * FunInter(t - .t1 - KierV[kier] * duty * pc) | |
| 54 | + } | |
| 55 | + } | |
| 56 | + return(y) | |
| 57 | + | |
| 58 | + | |
| 59 | +} | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | +#' Instead of looping through switching instants, loop is over t | |
| 64 | +#' Since I want to check randomly chosen t for the error checking purpose. | |
| 65 | +SimulationNormalTimes <- function(t, pc, duty, t0, Np, FunInter) { | |
| 66 | + | |
| 67 | + # max(t) may induce a lot of switching instants | |
| 68 | + t1 <- purrr::map(t0, function(.t1) .t1 + seq(-2 * Np - 1, ceiling(max(t) / pc)) * pc) | |
| 69 | + t1 <-sort(flatten_dbl(t1)) | |
| 70 | + | |
| 71 | + KierWsp <- c("+" = 1, "-" = -1) | |
| 72 | + KierV <- c("+" = 0, "-" = 1) | |
| 73 | + | |
| 74 | + y <- vector(mode = "numeric", length = length(t)) | |
| 75 | + i <- 1 | |
| 76 | + for(.t in t) { | |
| 77 | + # print(i) | |
| 78 | + for(kier in c("+", "-")) { | |
| 79 | + y[i] <- y[i] + sum(KierWsp[kier] * FunInter(.t - t1 - KierV[kier] * duty * pc)) | |
| 80 | + } | |
| 81 | + i <- i + 1 | |
| 82 | + } | |
| 83 | + return(y) | |
| 84 | + | |
| 85 | + | |
| 86 | +} | |
| 87 | + | |
| 88 | + | |
| 89 | +#' Simulation to check, if error comes from N_p selected values or from the equations. | |
| 90 | +#' | |
| 91 | +#' | |
| 92 | +SimulationNormalTimesNp <- function(t, pc, duty, t0, Np, FunInter) { | |
| 93 | + | |
| 94 | + # max(t) may induce a lot of switching instants | |
| 95 | + # NN <- length(t0) | |
| 96 | + t1 <- purrr::map(t0, function(.t1) .t1 + seq(-2 * Np - 1, ceiling(max(t) / pc)) * pc) | |
| 97 | + t1 <- sort(flatten_dbl(t1)) | |
| 98 | + | |
| 99 | + KierWsp <- c("+" = 1, "-" = -1) | |
| 100 | + KierV <- c("+" = 0, "-" = 1) | |
| 101 | + | |
| 102 | + y <- vector(mode = "numeric", length = length(t)) | |
| 103 | + i <- 1 | |
| 104 | + for(.t in t) { | |
| 105 | + for(kier in c("+", "-")) { | |
| 106 | + # Take only the last Np values. | |
| 107 | + .t1 <- t1[ (t1 + KierV[kier] * duty * pc) < .t & (t1 + KierV[kier] * duty * pc) >= .t - Np * pc] + KierV[kier] * duty * pc | |
| 108 | + # cat("Length .t1:", length(.t1), "- NN * Np:", NN * Np, "\n") | |
| 109 | + y[i] <- y[i] + sum(KierWsp[kier] * FunInter(.t - .t1)) | |
| 110 | + } | |
| 111 | + i <- i + 1 | |
| 112 | + } | |
| 113 | + return(y) | |
| 114 | + | |
| 115 | +} | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | +NpFun <- function(tol, A, lambda, pc) { | |
| 120 | + ceiling( (log(A) - log(tol)) / (lambda * pc) ) | |
| 121 | +} | |
| 122 | + | |
| 123 | + | |
| 124 | +sqwave <- function(t, t_on, duty, pc) { | |
| 125 | + yy <- rep(c(1, 0), times = length(t_on)) | |
| 126 | + tt <- sort(c(t_on, t_on + duty * pc)) | |
| 127 | + f1 <- approxfun(tt, yy, method = "constant") | |
| 128 | + return(f1(t)) | |
| 129 | +} | |
| 0 | 130 | \ No newline at end of file | ... | ... |
| ... | ... | @@ -0,0 +1,183 @@ |
| 1 | +#' ลปeby moje symulacje miaลy jakikolwiek sens, chciaลbym stworzyฤ strukturฤ | |
| 2 | +#' porzฤ dkujฤ ca te symulacje. Tym sposobem, nie bฤdฤ zawsze musiaล siฤ zastanawiaฤ | |
| 3 | +#' we jaki sposรณb porzadkowaฤ pliki. | |
| 4 | +#' Moim celem jest, ลผeby stworzyฤ tabelฤ, w ktรณrej trzymane bฤdฤ parametry | |
| 5 | +#' oraz nazwa pliku, w ktรณrym symulacje z danymi parametrami bฤdฤ przechowywane. | |
| 6 | +#' | |
| 7 | +#' Chodzi rรณwnieลผ o to, ลผeby tฤ tabelฤ moลผna byลo w prosty sposรณb uaktualniaฤ dodajฤ c | |
| 8 | +#' nowe wiersze, jeลliby doszลy nowe pliki. | |
| 9 | +#' | |
| 10 | +#' Tabela powinna mieฤ takลผe kolumnฤ ze wskaลบnikiem na wersjฤ (w przypadku | |
| 11 | +#' powtรณrzenia symulacji z tymi samymi parametrami) oraz komentarz, jeลli | |
| 12 | +#' jest jakiล potrzebny. | |
| 13 | +#' | |
| 14 | +library(tidyverse) | |
| 15 | +library(feather) | |
| 16 | + | |
| 17 | +# Struktura ---- | |
| 18 | +struktura <- tibble( | |
| 19 | + | |
| 20 | + # nazwa pliku | |
| 21 | + plik = character(), | |
| 22 | + | |
| 23 | + # nazwa pliku z zawartymi oryginalnymi przesuniฤciami t0 | |
| 24 | + plik_t0 = character(), | |
| 25 | + | |
| 26 | + # wersja symulacji | |
| 27 | + version = integer(), | |
| 28 | + | |
| 29 | + # czฤstotliwoลฤ transmisji danych | |
| 30 | + fd = numeric(), | |
| 31 | + | |
| 32 | + # dt = 1 / fd | |
| 33 | + dt = numeric(), | |
| 34 | + | |
| 35 | + # czฤstotliwoลฤ wลฤ czania konwerterรณw. | |
| 36 | + fc = numeric(), | |
| 37 | + | |
| 38 | + # odlegลoลฤ pomiฤdzy kolejnymi wลฤ czeniami (pc = 1/fc) | |
| 39 | + pc = numeric(), | |
| 40 | + | |
| 41 | + # duty cycle | |
| 42 | + duty = numeric(), | |
| 43 | + | |
| 44 | + # liczba konwerterรณw | |
| 45 | + NK = integer(), | |
| 46 | + | |
| 47 | + # liczba rund (powtรณrzeล symulacji) | |
| 48 | + rounds = integer(), | |
| 49 | + | |
| 50 | + # liczba bitรณw w ramce | |
| 51 | + N = integer(), | |
| 52 | + | |
| 53 | + # Parametry interferencji | |
| 54 | + # czฤstotliwoลฤ interferencji | |
| 55 | + f = numeric(), | |
| 56 | + | |
| 57 | + # amplituda | |
| 58 | + A = numeric(), | |
| 59 | + | |
| 60 | + # parametr tลumienia | |
| 61 | + lambda = numeric(), | |
| 62 | + | |
| 63 | + # liczba okresรณw pc trwania sygnaลu | |
| 64 | + Np = integer(), | |
| 65 | + | |
| 66 | + # tolerancja dla trwania sygnaลu | |
| 67 | + tol = numeric() | |
| 68 | + | |
| 69 | + | |
| 70 | +) | |
| 71 | + | |
| 72 | +# write_feather(struktura, "Results/struktura.feather") | |
| 73 | + | |
| 74 | + | |
| 75 | +# base_folder <- "/Volumes/Macbook Pro HDD /Doktorat/SCENT/Simulations/" | |
| 76 | +base_folder <- "/Users/karolniewiadomski/Documents/SCENT/Simulations/" | |
| 77 | + | |
| 78 | +# Funkcje do czytania plikรณw ---- | |
| 79 | +read_structure <- function() { | |
| 80 | + feather::read_feather(file.path(base_folder, "Results/struktura.feather")) | |
| 81 | +} | |
| 82 | + | |
| 83 | + | |
| 84 | +write_structure <- function(base_folder, new_structure) { | |
| 85 | + confirmation <- readline(prompt = "Do you really want to rewrite the current structure table? (y/n)") | |
| 86 | + if(confirmation == 'y') { | |
| 87 | + feather::write_feather(new_structure, file.path(base_folder, 'Results/struktura.feather')) | |
| 88 | + } | |
| 89 | +} | |
| 90 | + | |
| 91 | +#' TODO: make checks whenever possible, | |
| 92 | +#' especially check for the current rows to already exist. | |
| 93 | +update_structure <- function(updated) { | |
| 94 | + old_structure <- feather::read_feather(file.path(base_folder, "Results/struktura.feather")) | |
| 95 | + old_classes <- map(old_structure, class) | |
| 96 | + new_classes <- map(updated, class) | |
| 97 | + | |
| 98 | + classes_equal <- all.equal(old_classes, new_classes) | |
| 99 | + | |
| 100 | + if (class(classes_equal) == "logical") { | |
| 101 | + if (classes_equal) { | |
| 102 | + new_structure <- bind_rows(old_structure, updated) | |
| 103 | + feather::write_feather(new_structure, file.path(base_folder, "Results/struktura.feather")) | |
| 104 | + } | |
| 105 | + } else { | |
| 106 | + stop("Something is missing, check classes of your file.") | |
| 107 | + } | |
| 108 | +} | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | +#' TODO: check if it is possible not to read everytime. | |
| 116 | +get_structure_classes <- function() { | |
| 117 | + x <- feather::read_feather(file.path(base_folder, "Results/struktura.feather")) | |
| 118 | + map(x, class) | |
| 119 | +} | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | +# Assuming that names are not mixed up. | |
| 127 | +repair_classes <- function(new_structure) { | |
| 128 | + removes <- list("integer" = as.integer, "character" = as.character, "numeric" = as.numeric) | |
| 129 | + classes <- get_structure_classes() | |
| 130 | + nms <- names(new_structure) | |
| 131 | + for( i in seq(1, length(new_structure))) { | |
| 132 | + | |
| 133 | + new_structure[, i] <- mutate_all(new_structure[, i], removes[[classes[[nms[i]]]]]) | |
| 134 | + } | |
| 135 | + return(new_structure) | |
| 136 | +} | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | +# Example of usage | |
| 142 | +# new_structure <- list("cos", 1, 123, 1 / 123, 12, 1/234, 0.5, 4, 100, 4) | |
| 143 | +# names(new_structure) <- names(read_structure()) | |
| 144 | +# new_structure <- as_tibble(new_structure) | |
| 145 | +# classes <- get_structure_classes() | |
| 146 | +# | |
| 147 | +# nms <- names(new_structure) | |
| 148 | +# for( i in seq(1, length(new_structure))) { | |
| 149 | +# class(new_structure[, i]) <- classes[[nms[i]]] | |
| 150 | +# } | |
| 151 | +# | |
| 152 | +# update_structure(new_structure) | |
| 153 | + | |
| 154 | + | |
| 155 | +create_file_name <- function(NK, fc, fd, t0 = FALSE, ext = ".rds") { | |
| 156 | + fc <- format(fc, scientific = FALSE) | |
| 157 | + fd <- format(fd, scientific = FALSE) | |
| 158 | + if (t0) { | |
| 159 | + return(stringr::str_interp("nk_$[.3d]{NK}_fc_${fc}_fd_${fd}_t0${ext}") ) | |
| 160 | + } else { | |
| 161 | + return(stringr::str_interp("nk_$[.3d]{NK}_fc_${fc}_fd_${fd}${ext}")) | |
| 162 | + } | |
| 163 | +} | |
| 164 | + | |
| 165 | +# it is not very quick. - could work on that a bit more. | |
| 166 | +convert_file_name <- function(filename) { | |
| 167 | + # Could do with str_exctract_all but this is safer. | |
| 168 | + nk <- str_extract(filename, "nk_([:digit:]+)") | |
| 169 | + fc <- str_extract(filename, "fc_([:digit:]+)") | |
| 170 | + fd <- str_extract(filename, "fd_([:digit:]+)") | |
| 171 | + all_nums <- map(c(nk, fc, fd), function(x) parse_number(str_extract(x, "([:digit:]+)")) ) | |
| 172 | + names(all_nums) <- c("NK", "fc", "fd") | |
| 173 | + return(all_nums) | |
| 174 | +} | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | ... | ... |
R/hello.R deleted
| ... | ... | @@ -1,18 +0,0 @@ |
| 1 | -# Hello, world! | |
| 2 | -# | |
| 3 | -# This is an example function named 'hello' | |
| 4 | -# which prints 'Hello, world!'. | |
| 5 | -# | |
| 6 | -# You can learn more about package authoring with RStudio at: | |
| 7 | -# | |
| 8 | -# http://r-pkgs.had.co.nz/ | |
| 9 | -# | |
| 10 | -# Some useful keyboard shortcuts for package authoring: | |
| 11 | -# | |
| 12 | -# Install Package: 'Cmd + Shift + B' | |
| 13 | -# Check Package: 'Cmd + Shift + E' | |
| 14 | -# Test Package: 'Cmd + Shift + T' | |
| 15 | - | |
| 16 | -hello <- function() { | |
| 17 | - print("Hello, world!") | |
| 18 | -} |
| ... | ... | @@ -0,0 +1,143 @@ |
| 1 | +source("StrukturaPlikow.R") | |
| 2 | +TF <- read_structure() | |
| 3 | + | |
| 4 | +read_nk <- function(.version = 6, nk, .type = "odl") { | |
| 5 | + # Weลบmy konkretnฤ czฤstotliwoลฤ. | |
| 6 | + TF <- TF %>% filter(version == .version) | |
| 7 | + # TF <- TF %>% filter(fc == 20000) | |
| 8 | + TF <- TF %>% filter(NK == nk) | |
| 9 | + V_th <- 3 | |
| 10 | + | |
| 11 | + TD <- tibble() | |
| 12 | + for(i in seq_len(nrow(TF))) { | |
| 13 | + obj <- TF[i, ] | |
| 14 | + filename <- obj$plik | |
| 15 | + V <- read_rds(filename) | |
| 16 | + T2 <- map_dfr(V, function(syg) { | |
| 17 | + syg <- unlist(syg) | |
| 18 | + rley <- rle(abs(syg) >= V_th) | |
| 19 | + les <- rley$lengths | |
| 20 | + les <- les[-c(1, length(les))] | |
| 21 | + vals <- rley$values | |
| 22 | + vals <- vals[-c(1, length(vals))] | |
| 23 | + | |
| 24 | + if( .type == "zak" ) { | |
| 25 | + return( | |
| 26 | + with(obj, | |
| 27 | + tibble( | |
| 28 | + NK = NK, | |
| 29 | + pc = pc, fc = fc, | |
| 30 | + fd = fd, dt = dt, | |
| 31 | + A = A, f = f, lambda = lambda, | |
| 32 | + type = "zak", value = les[vals], N = N | |
| 33 | + )) | |
| 34 | + ) | |
| 35 | + } else if( .type == "odl" ) { | |
| 36 | + return( | |
| 37 | + with(obj, | |
| 38 | + tibble( | |
| 39 | + NK = NK, | |
| 40 | + pc = pc, fc = fc, | |
| 41 | + fd = fd, dt = dt, | |
| 42 | + A = A, f = f, lambda = lambda, | |
| 43 | + type = "odl", value = les[!vals], N = N | |
| 44 | + )) | |
| 45 | + ) | |
| 46 | + } else if( .type == "both" ) { | |
| 47 | + return( | |
| 48 | + with(obj, bind_rows( | |
| 49 | + tibble( | |
| 50 | + NK = NK, | |
| 51 | + pc = pc, fc = fc, | |
| 52 | + fd = fd, dt = dt, | |
| 53 | + A = A, f = f, lambda = lambda, | |
| 54 | + type = "zak", value = les[vals], N = N | |
| 55 | + ), | |
| 56 | + tibble( | |
| 57 | + NK = NK, | |
| 58 | + pc = pc, fc = fc, | |
| 59 | + fd = fd, dt = dt, | |
| 60 | + A = A, f = f, lambda = lambda, | |
| 61 | + type = "odl", value = les[!vals], N = N | |
| 62 | + ) | |
| 63 | + )) | |
| 64 | + ) | |
| 65 | + } | |
| 66 | + }) | |
| 67 | + | |
| 68 | + TD <- bind_rows(TD, T2) | |
| 69 | + } | |
| 70 | + return(TD) | |
| 71 | +} | |
| 72 | + | |
| 73 | + | |
| 74 | +read_freq <- function(.version = 6, freq, .type = "odl") { | |
| 75 | + | |
| 76 | + # Weลบmy konkretnฤ czฤstotliwoลฤ. | |
| 77 | + TF <- TF %>% filter(version == .version) | |
| 78 | + TF <- TF %>% filter(fc == freq) | |
| 79 | + # TF <- TF %>% filter(NK == nk) | |
| 80 | + V_th <- 3 | |
| 81 | + | |
| 82 | + TD <- tibble() | |
| 83 | + for(i in seq_len(nrow(TF))) { | |
| 84 | + obj <- TF[i, ] | |
| 85 | + filename <- obj$plik | |
| 86 | + V <- read_rds(filename) | |
| 87 | + T2 <- map_dfr(V, function(syg) { | |
| 88 | + syg <- unlist(syg) | |
| 89 | + rley <- rle(abs(syg) >= V_th) | |
| 90 | + les <- rley$lengths | |
| 91 | + les <- les[-c(1, length(les))] | |
| 92 | + vals <- rley$values | |
| 93 | + vals <- vals[-c(1, length(vals))] | |
| 94 | + | |
| 95 | + if( .type == "zak" ) { | |
| 96 | + return( | |
| 97 | + with(obj, | |
| 98 | + tibble( | |
| 99 | + NK = NK, | |
| 100 | + pc = pc, fc = fc, | |
| 101 | + fd = fd, dt = dt, | |
| 102 | + A = A, f = f, lambda = lambda, | |
| 103 | + type = "zak", value = les[vals], N = N | |
| 104 | + )) | |
| 105 | + ) | |
| 106 | + } else if( .type == "odl" ) { | |
| 107 | + return( | |
| 108 | + with(obj, | |
| 109 | + tibble( | |
| 110 | + NK = NK, | |
| 111 | + pc = pc, fc = fc, | |
| 112 | + fd = fd, dt = dt, | |
| 113 | + A = A, f = f, lambda = lambda, | |
| 114 | + type = "odl", value = les[!vals], N = N | |
| 115 | + )) | |
| 116 | + ) | |
| 117 | + } else if( .type == "both" ) { | |
| 118 | + return( | |
| 119 | + with(obj, bind_rows( | |
| 120 | + tibble( | |
| 121 | + NK = NK, | |
| 122 | + pc = pc, fc = fc, | |
| 123 | + fd = fd, dt = dt, | |
| 124 | + A = A, f = f, lambda = lambda, | |
| 125 | + type = "zak", value = les[vals], N = N | |
| 126 | + ), | |
| 127 | + tibble( | |
| 128 | + NK = NK, | |
| 129 | + pc = pc, fc = fc, | |
| 130 | + fd = fd, dt = dt, | |
| 131 | + A = A, f = f, lambda = lambda, | |
| 132 | + type = "odl", value = les[!vals], N = N | |
| 133 | + ) | |
| 134 | + )) | |
| 135 | + ) | |
| 136 | + } | |
| 137 | + }) | |
| 138 | + | |
| 139 | + TD <- bind_rows(TD, T2) | |
| 140 | + } | |
| 141 | + return(TD) | |
| 142 | + | |
| 143 | +} | ... | ... |