필터 지우기
필터 지우기

Function for getting only 30 peaks per sec of signal not working properly

조회 수: 3 (최근 30일)
[y, fs] = audioread('tonev2018.mp3');
% resizing of signal
y = mean(y,2);
y = y - mean(y);
% resampling
new_fs = 8000;
y = resample(y,new_fs,fs);
% spectrogram
window = 0.064 * new_fs;
noverlap = 0.032 * new_fs;
nfft = window;
[S, F, T] = spectrogram(y,window,noverlap,nfft,new_fs);
S = log(abs(S));
% peak detection
gs = 9;
peaks = zeros('like', S);
for shiftx=ceil(-gs/2):ceil(gs/2)
for shifty=ceil(-gs/2):ceil(gs/2)
CS = circshift(S, [shifty shiftx]);
peaks = peaks + ((S-CS)>0);
end
end
P = peaks==max(peaks(:));
%thresholding of peaks
tpeaks = [];
for i=1:16:size(P,2)
istart = i;
iend = i+15;
if iend > size(P, 2)
iend = size(P, 2);
end
sec = P(:, istart:iend);
flatten = reshape(sec, 1, size(sec,1)*size(sec,2));
sorted = sort(flatten, 'descend');
threshold = sorted(30);
sec(sec<threshold) = 0;
tpeaks = [tpeaks, sec];
end
So my code for thresholding peaks should leave out only 30 values for each second (which is 0.064 * 16) of signal but for some reason it doesn't do anything and I get same array as P. Any insight would be much apprappreciated. Thanks in advance.

채택된 답변

Atithi
Atithi 2023년 6월 16일
I have just finished reviewing the code and realized that there was nothing particularly incorrect with the original implementation. However, I did notice that it lacked any visualization of the spectrogram and detected peaks, which made it challenging to diagnose the issue with the peak thresholding. To address this, I went ahead and added in the necessary visualization data. This allowed me to conclude that the peak thresholding was functioning correctly, and the issue with the code may reside in the threshold value selection procedure.
% read audio file
[y, fs] = audioread('tonev2018.mp3');
% preprocessing: resizing of signal
y = mean(y, 2);
y = y - mean(y);
% preprocessing: resampling
new_fs = 8000;
y = resample(y, new_fs, fs);
% spectrogram
window = 0.064 * new_fs;
noverlap = 0.032 * new_fs;
nfft = window;
[S, F, T] = spectrogram(y, window, noverlap, nfft, new_fs);
S = log(abs(S));
% peak detection
gs = 9;
peaks = zeros('like', S);
for shiftx = ceil(-gs/2) : ceil(gs/2)
for shifty = ceil(-gs/2) : ceil(gs/2)
CS = circshift(S, [shifty, shiftx]);
peaks = peaks + ((S - CS) > 0);
end
end
P = peaks == max(peaks(:));
% thresholding of peaks
tpeaks = [];
for i = 1 : 16 : size(P, 2)
istart = i;
iend = i + 15;
if iend > size(P, 2)
iend = size(P, 2);
end
sec = P(:, istart:iend);
flatten = reshape(sec, 1, size(sec, 1)*size(sec, 2));
sorted = sort(flatten, 'descend');
threshold = sorted(30);
sec(sec < threshold) = 0;
tpeaks = [tpeaks, sec];
end
% plot spectrogram
figure;
imagesc(T, F, S);
set(gca, 'YDir', 'normal');
xlabel('Time (s)');
ylabel('Frequency (Hz)');
title('Spectrogram');
% plot detected peaks
figure;
imagesc(T, F, tpeaks);
set(gca, 'YDir', 'normal');
xlabel('Time (s)');
ylabel('Frequency (Hz)');
title('Detected Peaks');
Got this result as output.
do let me know if it was helpful

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Spectral Estimation에 대해 자세히 알아보기

제품


릴리스

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by