repos/hds25s

Scripts and Tools for OWON HDS25S Handheld Oscilloscope
Commits Files Refs
fft/main.m (3468B)
   1 clc; clear all; close all;
   2 
   3 %% Figure light theme
   4 
   5 set(0, "defaultAxesColorOrder", [
   6         1.0000 0.0000 0.0000;  # red
   7         0.0000 0.0000 1.0000;  # blue
   8         1.0000 0.4980 0.0549;  # orange
   9         0.0000 0.7490 1.0000;  # cyan
  10         0.1725 0.6275 0.1725;  # green
  11         0.5451 0.7020 0.0000;  # olive
  12         0.0471 0.4000 0.1373;  # deep green
  13         0.4000 0.7608 0.5020;  # mint
  14         0.6350 0.0780 0.1840;  # dark red
  15         0.0000 0.5882 0.5333;  # teal
  16         0.8510 0.6471 0.1255;  # gold
  17         0.5490 0.3373 0.2941;  # brown
  18         0.8902 0.4667 0.7608;  # pink
  19         0.5804 0.4039 0.7412;  # purple
  20         0.4980 0.4980 0.4980;  # gray
  21 ]);
  22 
  23 set(0, "DefaultFigureColor", [1 1 1]);
  24 set(0, "DefaultAxesColor", [1 1 1]);
  25 set(0, "DefaultAxesXColor", [0 0 0]);
  26 set(0, "DefaultAxesYColor", [0 0 0]);
  27 set(0, "DefaultTextColor", [0 0 0]);
  28 
  29 set(0, "DefaultAxesGridColor", [0 0 0]);
  30 set(0, 'DefaultAxesGridAlpha', 1.00);
  31 
  32 set(0, "DefaultAxesMinorGridColor", [0 0 0]);
  33 set(0, 'DefaultAxesMinorGridAlpha', 0.20);
  34 
  35 set(0, "DefaultLineLinewidth", 3.00);
  36 set(0, "DefaultAxesFontSize", 16);
  37 set(0, "DefaultTextFontSize", 16);
  38 set(0, "DefaultAxesLineWidth", 1.00);
  39 
  40 set(0, "DefaultAxesXGrid", "on");
  41 set(0, "DefaultAxesYGrid", "on");
  42 set(0, "DefaultAxesZGrid", "on");
  43 set(0, "DefaultAxesXMinorGrid", "on");
  44 set(0, "DefaultAxesYMinorGrid", "on");
  45 set(0, "DefaultAxesXMinorTick", "on");
  46 set(0, "DefaultAxesYMinorTick", "on");
  47 
  48 set(0, 'DefaultAxesGridAlpha', 0.50);
  49 set(0, "defaultAxesFontName", "Nimbus Sans");
  50 
  51 function dt = get_time_interval(filename)
  52     fid = fopen(filename, "r");
  53 
  54     % Read line 9
  55     for i = 1:9
  56         line = fgetl(fid);
  57     endfor
  58 
  59     fclose(fid);
  60 
  61     % Extract the value after the comma
  62     value = strtrim(strsplit(line, ","){2});
  63 
  64     % Convert the value to seconds
  65     dt = sscanf(value, "%f");
  66 
  67     if strfind(value, "uS")
  68         dt *= 1e-6;
  69     elseif strfind(value, "mS")
  70         dt *= 1e-3;
  71     elseif strfind(value, "nS")
  72         dt *= 1e-9;
  73     elseif strfind(value, "S")
  74         % already in seconds
  75     endif
  76 endfunction
  77 
  78 args = argv();
  79 
  80 if isempty(args)
  81     error("Usage: %s <filename>", program_name());
  82 endif
  83 
  84 filename = args{1};
  85 basename = tolower(strrep(filename, ".CSV", ""));
  86 png_savename = [basename, ".png"]
  87 fft_savename = [basename, "_fft.png"]
  88 
  89 data = dlmread(filename, ",", 10, 0);
  90 
  91 figure("visible", "off");
  92 grid on;
  93 
  94 set(gcf, "paperunits", "inches");
  95 set(gcf, "papersize", [10 4]);
  96 set(gcf, "paperposition", [0 0 10 4]);
  97 
  98 index = data(:, 1);
  99 voltage = data(:, 2);
 100 
 101 dt = get_time_interval(filename)
 102 % dt = 0.80e-6;
 103 
 104 n = length(voltage)
 105 trigger_offset = 50;
 106 time = ((0:n-1) - (n/2 - trigger_offset)) * dt;
 107 
 108 t_max = ((n-1)/2*dt)*1e6
 109 v_max = max(voltage)
 110 
 111 plot(time*1e3, voltage);
 112 
 113 xlim([-(t_max-trigger_offset)/1.05/1e3 (t_max-trigger_offset)/1.05/1e3])
 114 ylim([-v_max*1.10 v_max*1.10])
 115 
 116 xlabel("TIEMPO  [ms]");
 117 ylabel("VOLTAJE  [V]");
 118 grid on;
 119 
 120 print(png_savename, "-dpng", "-r600");
 121 close
 122 
 123 % FFT
 124 figure("visible", "off");
 125 grid on;
 126 
 127 set(gcf, "paperunits", "inches");
 128 set(gcf, "papersize", [10 4]);
 129 set(gcf, "paperposition", [0 0 10 4]);
 130 
 131 Y = fft(voltage);
 132 
 133 % Two-sided magnitude spectrum
 134 P2 = abs(Y / n);
 135 
 136 % Single-sided spectrum
 137 P1 = P2(1:floor(n/2)+1);
 138 P1(2:end-1) = 2 * P1(2:end-1);
 139 
 140 % Frequency axis
 141 f = (0:floor(n/2)) / (n * dt);
 142 
 143 % Plot
 144 plot(f / 1000, P1, "linewidth", 1.5);
 145 
 146 xlabel("FRECUENCIA [kHz]");
 147 ylabel("MAGNITUDE  [V]");
 148 grid on;
 149 
 150 xlim([0 200])
 151 
 152 print(fft_savename, "-dpng", "-r600");