Why is my fundamental frequency at the 15th harmonic order
3 views (last 30 days)
Show older comments
Dear Matlab Community.
I am trying to implement a code to show harmonic content and order in Matlab. my fundamental is supposed to be at harmonic order 1, however the ouput plot I am getting is wrong and I am having difficulies proceeding.
I would really apreciate any help. Thanks
[D,S,R] = xlsread('test data.xls');
v = D(:,2);
Signal = D(:,2);
Ts = 0.00005; % Sampling Interval (seconds)
Fs = 1/Ts; % Sampling Frequency (Hz)
Fn = Fs/2;
%PERFOM FFT
N = length(Signal);
meanSignal = mean(Signal); % ‘Signal’ Mean
FTSignal = fft(Signal-meanSignal)/N;
Fv = linspace(0, 1, fix(numel(FTSignal)/2)+1)*Fn; % Frequency Vector
Iv = 1:numel(Fv); % Index Vector
%Plotting Harmonics (THD)
har_mag = abs(FTSignal(Iv))*2;
figure;
bar(har_mag(1:20),0.4)
xlabel('Harmonic Order','fontsize',10);
ylabel('Voltage (V)','fontsize',10)
hold off
3 Comments
Rik
on 5 May 2020
Why did you edit away important parts of your question and delete several comments? That is extremely rude.
Accepted Answer
Star Strider
on 4 May 2020
I am not certain what you are doing, or what result you want.
One problem is that you also need to specify the x-values of the bars in your bar call:
bar(Fv(1:20), har_mag(1:20),0.4)
If you want to find all the relevant peaks and their frequencies, add these lines after your existing (posted) code:
[pks,locs] = findpeaks(har_mag, 'MinPeakProminence',0.5);
FreqPeaks = table(Fv(locs)', pks, 20*log10(pks), 'VariableNames',{'Freq', 'Amp', 'dB'})
figure
plot(Fv, 20*log10(har_mag))
hold on
plot(Fv(locs), 20*log10(har_mag(locs)), '+r')
hold off
grid
axis([0 1200 -15 60])
The ‘FreqPeaks’ table has all the identified peaks (linear and dB) and their associated frequencies.
3 Comments
Star Strider
on 4 May 2020
As always, my pleasure!
The ‘FreqPeaks’ table changes again so the fourth column is now the percentage of the fundamental amplitude:
FreqPeaks = table(Fv(locs)', Fv(locs)'/Fv(locs(1))', pks, pks/pks(1)*100, 'VariableNames',{'Freq', 'HarmNr', 'Amp', 'PctFund'})
and the bar plot becomes:
figure
bar(FreqPeaks{:,2}, FreqPeaks{:,4})
xlabel('Harmonic Number')
ylabel('Percent of Fundamental Amplitude')
xlim([0 20])
Setting the y-scale to logarithmic makes them a bit easier to see:
figure
bar(FreqPeaks{:,2}, FreqPeaks{:,4})
set(gca, 'YScale','log')
xlabel('Harmonic Number')
ylabel('Percent of Fundamental Amplitude')
xlim([0 20])
Choose the one that works best in your application.
Star Strider
on 4 May 2020
As always, my pleasure!
I wasn’t initially certain what you want to do. I’m glad we got this sorted!
More Answers (1)
Rafael Hernandez-Walls
on 4 May 2020
why don't use the FTTSHIFT, this function Shift zero-frequency component to center of spectrum.
0 Comments
See Also
Categories
Find more on Spectral Measurements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!