1 view (last 30 days)

Show older comments

So, I have an audio signal with fs=8192 and total samples=73113, which gives the total duration of the signal as 8.9249 seconds. My aim is to calculate the power of this signal for each second and plot it. Basically what I mean is to calculate the power of signal between 0th sec and 1st second and so on and then plot them with time on x axis. I tried calculating power element wise but I am not getting element wise power using "power=rms(y_b).^2", I am not getting correct vector so I am unable to move forward, I cannot think of a way, can someone plese help.

[y,fs]=audioread('h.wav');

y_b=bandpass(y,[300 2000],fs);

N=length(y);

time=N/fs;

t = linspace(0, time, N);

subplot(2,1,1);

plot (t,y_b);

% how to calculate power for each signal?

%....code....

subplot (2,1,2);

plot(time1,power);

Thank you

Star Strider
on 28 Apr 2021

Edited: Star Strider
on 28 Apr 2021

Use the buffer function to segment the signal into 1-second increments. Since you want 1-second samples, the vector length is simply ‘Fs’, so —

y = randn(73113,1); % Create Signal To Test Code (One Channel)

fs = 8192; % Sampling Frequency (Also Frame Length)

N = size(y,1); % Signal Length

time = linspace(0, N, N-1)/fs; % Time Vector

y_b = bandpass(y,[300 2000],fs); % Filter Signal

y_seg = buffer(y_b,fs); % Matrix Of Signal Segments

y_pwr = sum(y_seg.^2); % Calculate Power

figure

for k = 1:numel(y_pwr)-1

tv = time((1:fs)+fs*(k-1));

subplot(5,2,k)

plot(tv,y_seg(:,k))

grid

title(sprintf('Segment %d Power %.1f',k,y_pwr(k)))

end

subplot(5,2,k+1)

tv = time(fs*k:end);

plot(tv,y_seg(1:numel(tv),k+1))

grid

title(sprintf('Segment %d Power %.1f',k+1,y_pwr(k+1)))

EDIT — (28 Apr 2021 at 12:40)

Corrected typoographical error.

Mathieu NOE
on 28 Apr 2021

hello

if you want to compute a running rms value , you can use the movstd function - see help movstd

and use K = fs=8192 to average the computation over 1 second interval;

movstd Moving standard deviation value.

Y = movstd(X,K) for a vector X and positive integer scalar K computes a

centered moving standard deviation by sliding a window of length K

along X. Each element of Y is the local standard deviation of the

corresponding values of X inside the window, with Y the same size as X.

When K is even, the window is centered about the current and previous

elements of X. The sliding window is truncated at the endpoints where

there are fewer than K elements from X to fill the window.

now this will give you a rms calculation with the same time increment as your data, you can decide afterwards to plot only values with 1 second interval (so index values multiple of fs = 8192 )

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!