How to find corresponding frequencies after viewing amplitude in descending order?
4 views (last 30 days)
Show older comments
Vikash Mahabir
on 26 Feb 2021
Answered: sugga singh
on 28 Feb 2021
Good day. Below I have a piece of code written.
%% Peak detection Part
% In this part, we have defined a threshold value. So, all peaks above
% threshold value will be detected.
temp_fft = data_filt_ft;
% Normalize the FFT
temp_fft = temp_fft/max(temp_fft);
% threshold
th = 0.02; % i.e. 1% of maximum amplitude
temp_fft(temp_fft < th) = 0; %you can skip this step by commenting this.
% Plot FFT after thresholding
figure; plot(fr, temp_fft);
xlabel('Frequency(Hz)'); ylabel('Amplitude');
grid on;
% find peaks of the remaining data
[peak_ft, peak_loc] = findpeaks(temp_fft);
% frequency corresponding to peak
[peak_fr] = fr(peak_loc);
%Sort amplitude values into descending order
DescendAmp = sort(peak_ft,'descend');
% this fuction returns the fourier transform of the signal
function [ft, f] = fr_t(x, Fs)
L = length(x);
% NFFT = 2^nextpow2(L); % Next power of 2 from length of y
NFFT = L;
X = fft(x,NFFT)/NFFT;
f = Fs/2*linspace(0,1,floor(NFFT/2+1));
ft = abs(X(1:floor(NFFT/2+1)));
% ft = 20*log10(ft);
% plot(f,ft);
end
I am able to sort the amplitudes into descending order but I am unable to view the corresponding frequency values in that order. How can I view the corresponding frequency values in that order?
0 Comments
Accepted Answer
Mathieu NOE
on 26 Feb 2021
hello
I modifed a bit your code and tested it with a two tone signal
see the line with peak_fr_sorted_values
clc
%% dummy data
Fs = 1e3;
samples = 1e4;
t = (0:samples-1)'*1/Fs;
signal = 0.7*cos(2*pi*50*t)+0.4*cos(2*pi*100*t)+0.1*randn(samples,1);
[data_filt_ft, fr] = fr_t(signal, Fs);
%% Peak detection Part
% In this part, we have defined a threshold value. So, all peaks above
% threshold value will be detected.
temp_fft = data_filt_ft;
% Normalize the FFT
temp_fft = temp_fft/max(temp_fft);
% threshold
th = 0.02; % i.e. 1% of maximum amplitude
temp_fft(temp_fft < th) = 0; %you can skip this step by commenting this.
% Plot FFT after thresholding
figure; plot(fr, temp_fft);
xlabel('Frequency(Hz)'); ylabel('Amplitude');
grid on;
% find peaks of the remaining data
[peak_ft, peak_loc] = findpeaks(temp_fft);
%Sort amplitude values into ascending order
[peak_ft_sorted_values,peak_ft_sorted_index] = sort(peak_ft,'ascend');
% frequency corresponding to peak
[peak_fr] = fr(peak_loc);
% and now sorted according to amplitude (above)
peak_fr_sorted_values = peak_fr(peak_ft_sorted_index)
% this fuction returns the fourier transform of the signal
function [ft, f] = fr_t(x, Fs)
L = length(x);
% NFFT = 2^nextpow2(L); % Next power of 2 from length of y
NFFT = L;
X = fft(x,NFFT)/NFFT;
f = Fs/2*linspace(0,1,floor(NFFT/2+1));
ft = abs(X(1:floor(NFFT/2+1)));
% ft = 20*log10(ft);
% plot(f,ft);
end
3 Comments
More Answers (2)
dpb
on 26 Feb 2021
[DescendAmp,idx] = sort(peak_ft,'descend');
disp([peak_fr(idx) peak_ft])
0 Comments
See Also
Categories
Find more on Fourier Analysis and Filtering in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!