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 @@ | @@ -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 | \ No newline at end of file | 130 | \ No newline at end of file |
@@ -0,0 +1,183 @@ | @@ -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,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 @@ | @@ -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 | +} |