1function results = signal_analysis(signal, fs)
2 N = length(signal);
3 t = (0:N-1) / fs;
4
5 results.time = t;
6 results.signal = signal;
7
8 results.mean = mean(signal);
9 results.rms = sqrt(mean(signal.^2));
10 results.peak = max(abs(signal));
11 results.crest_factor = results.peak / results.rms;
12
13 Y = fft(signal);
14 P2 = abs(Y / N);
15 P1 = P2(1:N/2+1);
16 P1(2:end-1) = 2 * P1(2:end-1);
17 f = fs * (0:(N/2)) / N;
18
19 results.freq = f;
20 results.spectrum = P1;
21
22 [~, idx] = max(P1(2:end));
23 results.dominant_freq = f(idx + 1);
24
25 window_size = round(fs * 0.05);
26 b = ones(1, window_size) / window_size;
27 results.smoothed = filter(b, 1, signal);
28
29 band_low = 100;
30 band_high = 1000;
31 mask = (f >= band_low) & (f <= band_high);
32 results.band_energy = sum(P1(mask).^2);
33 results.total_energy = sum(P1.^2);
34 results.band_ratio = results.band_energy ...
35 / results.total_energy;
36
37 frame_len = round(fs * 0.025);
38 frame_hop = round(fs * 0.010);
39 num_frames = floor((N - frame_len) / frame_hop) + 1;
40 results.envelope = zeros(1, num_frames);
41
42 for i = 1:num_frames
43 start_idx = (i-1) * frame_hop + 1;
44 end_idx = start_idx + frame_len - 1;
45 frame = signal(start_idx:end_idx);
46 results.envelope(i) = sqrt(mean(frame.^2));
47 end
48
49 threshold = 0.1 * results.peak;
50 crossings = find(diff(sign(signal - threshold)));
51 if length(crossings) >= 2
52 periods = diff(crossings) / fs;
53 results.avg_period = mean(periods);
54 else
55 results.avg_period = 0;
56 end
57end