Why is my fundamental frequency at the 15th harmonic order

2 ビュー (過去 30 日間)
Jmv
Jmv 2020 年 5 月 4 日
コメント済み: Rena Berman 2020 年 5 月 14 日
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 件のコメント
Rik
Rik 2020 年 5 月 5 日
Why did you edit away important parts of your question and delete several comments? That is extremely rude.
Rena Berman
Rena Berman 2020 年 5 月 14 日
(Answers Dev) Restored edit

サインインしてコメントする。

採用された回答

Star Strider
Star Strider 2020 年 5 月 4 日
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 件のコメント
Star Strider
Star Strider 2020 年 5 月 4 日
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
Star Strider 2020 年 5 月 4 日
As always, my pleasure!
I wasn’t initially certain what you want to do. I’m glad we got this sorted!

サインインしてコメントする。

その他の回答 (1 件)

Rafael Hernandez-Walls
Rafael Hernandez-Walls 2020 年 5 月 4 日
why don't use the FTTSHIFT, this function Shift zero-frequency component to center of spectrum.

カテゴリ

Help Center および File ExchangeSpectral Measurements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by