Advertisement
GibMeclay

Untitled

May 14th, 2025
1,256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 5.65 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 = 8.8;                                % Maksymalny promie? [m] Zmierzone w modelu idealnym
  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 = 14.5;        % [Ohm] rezystancja chipa
  18. Za = 293;         % [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(90, -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. Z_tag = Zc;
  70. Z_chip = Zc;
  71. ReZ_tag = real(Z_tag);
  72. ReZ_chip = real(Z_chip);
  73. ImZ_sum = imag(Z_tag + Z_chip);
  74. ReZ_sum = real(Z_tag + Z_chip);
  75. matching_loss = (4 * ReZ_tag * ReZ_chip) / (ReZ_sum^2 + ImZ_sum^2);
  76.  
  77. % Moc dostarczona z uwzgl?dnieniem odbicia
  78. Pr_lin = 10^((Ptx_dBm + gain_reader + gain_tag - L_dB - RC)/10);
  79. Pd_lin = Pr_lin * matching_loss;
  80. PT(i) = 2*log10(Pd_lin);
  81.         end
  82.         plot(frequency_range/1e6, PT);
  83.         legends{end+1} = sprintf('r = %.1f m', r);
  84.     end
  85.  
  86.     xlabel('Cz?stotliwo?? [MHz]');
  87.     ylabel('Moc dostarczona do taga [dBm]');
  88.     title(sprintf('Charakterystyka PT(f) – metoda: %s', method));
  89.     legend(legends, 'Location', 'best');
  90.     grid on;
  91. end
  92.  
  93. %% Mapa 2D mocy odbieranej Pr(x, y) dla f = 865 MHz
  94. f_map = 865e6;
  95. lambda = 3e8 / f_map;
  96. range = -10:0.2:15;
  97. [X, Y] = meshgrid(range, range);
  98.  
  99. for m = 1:length(mode_tag_methods)
  100.     method = mode_tag_methods{m};
  101.     Pr_map = zeros(size(X));
  102.  
  103.     for i = 1:size(X, 1)
  104.         for j = 1:size(X, 2)
  105.             x = X(i, j);
  106.             y = Y(i, j);
  107.             r = sqrt(x^2 + y^2);
  108.             theta = atan2d(y, sqrt(x^2));
  109.             theta = mod(theta + 360, 360);
  110.  
  111.             gain_reader = readerPattern(theta, G0R_dBi, HPBWR);
  112.             if strcmp(method, 'real')
  113.                 gain_tag = F_tag(theta, -30);
  114.             else
  115.                 gain_tag = idealTagPattern(theta);
  116.             end
  117.  
  118.             L = (4 * pi * r / lambda)^2;
  119.             L_dB = 10 * log10(L);
  120.           %% Impedancyjne dopasowanie
  121. Xc = 2 * pi * f_map * C_chip;
  122. Zc = Rc + 1i * Xc;
  123. Gamma = (Zc - Za) / (Zc + Za);
  124. matching_loss = 1 - abs(Gamma)^2;
  125.  
  126. % Moc z uwzgl?dnieniem odbicia
  127. Pr_lin = 10^((Ptx_dBm + gain_reader + gain_tag - L_dB - RC)/10);
  128. Pd_lin = Pr_lin * matching_loss;
  129. Pr_map(i, j) = 10 * log10(Pd_lin);
  130.         end
  131.     end
  132.  
  133.     figure;
  134.     imagesc(range, range, Pr_map .* (Y >= 0));
  135.     colormap('jet');         % lub 'parula', 'hot', 'turbo'
  136.     caxis([-40 0]);          % ustalony zakres dBm
  137.     hold on;
  138.     [C, h] = contour(X, Y, Pr_map, [-21 -21], 'LineColor', 'k', 'LineWidth', 1.5);
  139.     clabel(C, h, '-18 dBm');
  140.     set(gca, 'YDir', 'normal');
  141.     colorbar;
  142.     title(sprintf('Mapa Pr(x,y) dla f = %.0f MHz, metoda: %s', f_map/1e6, method));
  143.     xlabel('x [m]'); ylabel('y [m]');
  144. end
  145.  
  146. %% Ocena poprawnej pracy dla f = 865, 915 MHz
  147. theta_tag = 90;
  148. phi_tag = -30;
  149.  
  150. fprintf('\n--- Ocena poprawnej pracy (f = 865, 915 MHz) ---\n');
  151. for f = frequencies
  152.     lambda = 3e8 / f;
  153.     fprintf('\nCzestotliwosc: %.0f MHz\n', f/1e6);
  154.     for r = r_values
  155.         gain_reader = readerPattern(theta_tag, G0R_dBi, HPBWR);
  156.         gain_tag = F_tag(theta_tag, phi_tag);
  157.         L = (4 * pi * r / lambda)^2;
  158.         L_dB = 10 * log10(L);
  159.        %% Dopasowanie impedancji
  160. Xc = 2 * pi * f * C_chip;
  161. Zc = Rc + 1i * Xc;
  162. Gamma = (Zc - Za) / (Zc + Za);
  163. matching_loss = 1 - abs(Gamma)^2;
  164. Pr_lin = 10^((Ptx_dBm + gain_reader + gain_tag - L_dB - RC)/10);
  165. Pd_lin = Pr_lin * matching_loss;
  166. Pr_dBm = 10 * log10(Pd_lin);
  167.         status = 'NIE';
  168.         if Pr_dBm >= Pr_min_dBm
  169.             status = 'TAK';
  170.         end
  171.         fprintf('r = %.2f m, Pr = %.2f dBm, Poprawna praca: ''%s''\n', r, Pr_dBm, status);
  172.     end
  173. end
  174.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement