Why is my fundamental frequency at the 15th harmonic order
    5 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!




