Advertisement
GibMeclay

Untitled

May 13th, 2025
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.48 KB | None | 0 0
  1. close all ;
  2. clear; clc;
  3.  
  4. %% Parametry systemu
  5. frequencies = [865e6, 915e6]; % [Hz], podstawowe cz?stotliwo?ci
  6. frequency_range = 800e6:5e6:1000e6; % [Hz], zakres modelowania
  7. rPwrMax = 5; % Maksymalny promie? [m]
  8. r_values = [0.9, 0.7, 0.5] * rPwrMax; % Promienie analizy
  9. mode_tag_methods = {'real', 'ideal'}; % Dwie metody modelowania anteny taga
  10.  
  11. %% Parametry anteny czytnika
  12. G0R_dBi = 7; % Maksymalny zysk [dBi]
  13. HPBWR = 58; % Half-Power Beamwidth [deg]
  14.  
  15. %% Parametry ogólne
  16. C_chip = 0.63e-12; % [F] pojemno?? chipa RFID
  17. Rc = 150; % [Ohm] rezystancja chipa
  18. Za = 50; % [Ohm] impedancja anteny (przyj?ta sta?a)
  19. RC = 0.5; % strata polaryzacyjna [dB]
  20. Ptx_dBm = 30; % Moc nadajnika [dBm]
  21. Pr_min_dBm = -21; % Czułość taga [dBm]
  22.  
  23. %% Wczytanie danych z 4nec2 (charakterystyka promieniowania taga)
  24.  
  25. rawData = readtable('book3.csv', 'Delimiter', ';');
  26. theta = rawData{:,1};
  27. phi = rawData{:,2};
  28. gain = rawData{:,3};
  29. gain(gain < -100) = NaN;
  30. valid = ~isnan(gain);
  31. theta = theta(valid);
  32. phi = phi(valid);
  33. gain = gain(valid);
  34. [uniquePairs, ia, ~] = unique([theta, phi], 'rows');
  35. theta = uniquePairs(:,1);
  36. phi = uniquePairs(:,2);
  37. gain = gain(ia);
  38. F_tag = scatteredInterpolant(theta, phi, gain, 'linear', 'nearest');
  39.  
  40. %% Funkcja anteny czytnika (modelowana)
  41. readerPattern = @(theta, G0, HPBW) G0 - 3*(abs(theta)/HPBW).^(-log(0.5)/log(cosd(HPBWR/2)));
  42. idealTagPattern = @(theta) 0; % Model izotropowy (sta?y zysk 0 dBi)
  43.  
  44. %% Analiza i wykresy: PT(f) dla ró?nych r i metod
  45.  
  46. for m = 1:length(mode_tag_methods)
  47. method = mode_tag_methods{m};
  48. figure('Name', sprintf('Metoda: %s', method)); hold on;
  49. legends = {};
  50.  
  51. for r = r_values
  52. PT = zeros(size(frequency_range));
  53. for i = 1:length(frequency_range)
  54. f = frequency_range(i);
  55. lambda = 3e8 / f;
  56. gain_reader = readerPattern(30, G0R_dBi, HPBWR);
  57.  
  58. if strcmp(method, 'real')
  59. gain_tag = F_tag(0, -30);
  60. else
  61. gain_tag = idealTagPattern(0);
  62. end
  63.  
  64. L = (4 * pi * r / lambda)^2;
  65. L_dB = 10 * log10(L);
  66. %% Obliczenie dopasowania impedancyjnego
  67. Xc = 2 * pi * f * C_chip;
  68. Zc = Rc + 1i * Xc;
  69. Gamma = (Zc - Za) / (Zc + Za);
  70. matching_loss = 1 - abs(Gamma)^2;
  71.  
  72. % Moc dostarczona z uwzgl?dnieniem odbicia
  73. Pr_lin = 10^((Ptx_dBm + gain_reader + gain_tag - L_dB - RC)/10);
  74. Pd_lin = Pr_lin * matching_loss;
  75. PT(i) = 10 * log10(Pd_lin);
  76. end
  77. plot(frequency_range/1e6, PT);
  78. legends{end+1} = sprintf('r = %.1f m', r);
  79. end
  80.  
  81. xlabel('Cz?stotliwo?? [MHz]');
  82. ylabel('Moc dostarczona do taga [dBm]');
  83. title(sprintf('Charakterystyka PT(f) – metoda: %s', method));
  84. legend(legends, 'Location', 'best');
  85. grid on;
  86. end
  87.  
  88. %% Mapa 2D mocy odbieranej Pr(x, y) dla f = 865 MHz
  89. f_map = 865e6;
  90. lambda = 3e8 / f_map;
  91. range = -10:0.2:15;
  92. [X, Y] = meshgrid(range, range);
  93.  
  94. for m = 1:length(mode_tag_methods)
  95. method = mode_tag_methods{m};
  96. Pr_map = zeros(size(X));
  97.  
  98. for i = 1:size(X, 1)
  99. for j = 1:size(X, 2)
  100. x = X(i, j);
  101. y = Y(i, j);
  102. r = sqrt(x^2 + y^2);
  103. theta = atan2d(y, sqrt(x^2));
  104. theta = mod(theta + 360, 360);
  105.  
  106. gain_reader = readerPattern(theta, G0R_dBi, HPBWR);
  107. if strcmp(method, 'real')
  108. gain_tag = F_tag(theta, -30);
  109. else
  110. gain_tag = idealTagPattern(theta);
  111. end
  112.  
  113. L = (4 * pi * r / lambda)^2;
  114. L_dB = 10 * log10(L);
  115. %% Impedancyjne dopasowanie
  116. Xc = 2 * pi * f_map * C_chip;
  117. Zc = Rc + 1i * Xc;
  118. Gamma = (Zc - Za) / (Zc + Za);
  119. matching_loss = 1 - abs(Gamma)^2;
  120.  
  121. % Moc z uwzgl?dnieniem odbicia
  122. Pr_lin = 10^((Ptx_dBm + gain_reader + gain_tag - L_dB - RC)/10);
  123. Pd_lin = Pr_lin * matching_loss;
  124. Pr_map(i, j) = 10 * log10(Pd_lin);
  125. end
  126. end
  127.  
  128. figure;
  129. imagesc(range, range, Pr_map .* (Y >= 0));
  130. colormap('jet'); % lub 'parula', 'hot', 'turbo'
  131. caxis([-40 0]); % ustalony zakres dBm
  132. hold on;
  133. [C, h] = contour(X, Y, Pr_map, [-21 -21], 'LineColor', 'k', 'LineWidth', 1.5);
  134. clabel(C, h, '-18 dBm');
  135. set(gca, 'YDir', 'normal');
  136. colorbar;
  137. title(sprintf('Mapa Pr(x,y) dla f = %.0f MHz, metoda: %s', f_map/1e6, method));
  138. xlabel('x [m]'); ylabel('y [m]');
  139. end
  140.  
  141. %% Ocena poprawnej pracy dla f = 865, 915 MHz
  142. theta_tag = 90;
  143. phi_tag = -30;
  144.  
  145. fprintf('\n--- Ocena poprawnej pracy (f = 865, 915 MHz) ---\n');
  146. for f = frequencies
  147. lambda = 3e8 / f;
  148. fprintf('\nCzestotliwosc: %.0f MHz\n', f/1e6);
  149. for r = r_values
  150. gain_reader = readerPattern(theta_tag, G0R_dBi, HPBWR);
  151. gain_tag = F_tag(theta_tag, phi_tag);
  152. L = (4 * pi * r / lambda)^2;
  153. L_dB = 10 * log10(L);
  154. %% Dopasowanie impedancji
  155. Xc = 2 * pi * f * C_chip;
  156. Zc = Rc + 1i * Xc;
  157. Gamma = (Zc - Za) / (Zc + Za);
  158. matching_loss = 1 - abs(Gamma)^2;
  159. Pr_lin = 10^((Ptx_dBm + gain_reader + gain_tag - L_dB - RC)/10);
  160. Pd_lin = Pr_lin * matching_loss;
  161. Pr_dBm = 10 * log10(Pd_lin);
  162. status = 'NIE';
  163. if Pr_dBm >= Pr_min_dBm
  164. status = 'TAK';
  165. end
  166. fprintf('r = %.2f m, Pr = %.2f dBm, Poprawna praca: ''%s''\n', r, Pr_dBm, status);
  167. end
  168. end
  169.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement