06-23-2009 03:36 AM
Dear NI,
Running Measurement Studio 8.6 .NET, Windows XP, Language C#
When running your example code for Measurements.HarmonicAnalyzer Method (Double[], Int32, Int32, WindowType, Double, Double, Double[], Double[], Double) as shown below in bold, the output harmonicFrequencies are
harmonicFrequencies[0] = 7.7970295824343339
harmonicFrequencies[1] = 17.098146039643325
which is NOT as expected. The expected harmonic frequencies are
harmonicFrequencies[0] = 1
harmonicFrequencies[1] = 2
The test signal in the example DOES NOT contain 3 periods of the fundamental frequency, which the Measurements.AutoPowerSpectrum Method (see this method's help manual) indicates should be included for the method to return useful data. Even when numsamples is increased from 1024 (1 period of samples for fundamental frequency) to 10240 (10 periods) the return harmonicFrequencies are
harmonicFrequencies[0] = 1.1289688016404398
harmonicFrequencies[1] = 1.7884341461467557
which is clearly still incorrect.
The harmonicFrequencies generated by Measurements.HarmonicAnalyzer should be dependendent ONLY on the fundamentalFrequency and SamplingRate parameters.
double[] autoPowerSpectrum;
double[] waveformData, gaussNoiseData;
double[] harmonicAmplitudes, harmonicFrequencies;
double dt, df, equivalentNoiseBandwidth, coherentGain;
double samplingRate, fundamentalFrequency, thdNoise, percentTHD;
int frameSize, numberOfHarmonics, numSamples;
ScaledWindow scaleWindow;
GaussianNoiseSignal gaussNoiseSignal = new GaussianNoiseSignal(1.0, 0);
SineSignal sineSignal = new SineSignal();
numSamples = 1024;
samplingRate = 1000.0;
fundamentalFrequency = 1000.0 / samplingRate;
// Generate a sine signal representing waveformData and a Gaussian noise signal representing gaussNoiseData
waveformData = sineSignal.Generate(1000.0, numSamples);
gaussNoiseData = gaussNoiseSignal.Generate(1000.0, numSamples);
// Cause system distortion
for (int i = 0; i < numSamples; i++)
waveformData[i] = 0.5 * gaussNoiseData[i] + waveformData[i] * waveformData[i] * 0.05 + waveformData[i];
// Set the sample period
dt = 1.0 / samplingRate;
// Create a Blackman window
scaleWindow = ScaledWindow.CreateBlackmanWindow();
// Apply window on the waveformData
scaleWindow.Apply(waveformData, out equivalentNoiseBandwidth, out coherentGain);
// Calculate the single-sided, scaled auto power spectrum of signal
autoPowerSpectrum = Measurements.AutoPowerSpectrum(waveformData, dt, out df);
numberOfHarmonics = 2;
frameSize = numSamples;
// Calculate the fundamental and harmonic amplitudes and frequencies present in autoPowerSpectrum
// This method also calculates the percent of total harmonic distortion (percentTHD) and the total harmonic distortion, plus noise (thdNoise)
percentTHD = Measurements.HarmonicAnalyzer(autoPowerSpectrum, frameSize, numberOfHarmonics, WindowType.Blackman, samplingRate, fundamentalFrequency, out harmonicAmplitudes, out harmonicFrequencies, out thdNoise);
06-23-2009 06:29 PM
What example code are running and where did you find this project, was it a shipping example or was this downloaded off of our website? I would like to run this on my end to verify your findings.
Regards,
Steven Zittrower
Applications Engineer
National Instruments
06-23-2009 08:06 PM
The example code I ran is INCLUDED in my post.
This example is found in the NI Measurement Studio 8.6 documentation. You can open this by navigating to
Start -> All Programs -> National Instruments -> Measurement Studio 8.6 for Visual Studio 2008 -> Measurement Studio Documentation
In this help file, navigate to
NI Measurement Studio Help -> NI Measurement Studio .NET Class Library -> NationalInstruments.Analysis.SpectralMeasurements -> Measurements Class -> Methods -> HarmonicAnalyzer Method -> HarmonicAnalyzer Method (Double[], Int32, Int32, WindowType, Double, Double, Double[], Double[], Double)
Under this method explanation, the example is the same as the method I included in my initial thread post.