ENH: noiseModels - updated frequency bounds handling

This commit is contained in:
Andrew Heather
2017-03-03 14:24:56 +00:00
parent 9741ce6e0d
commit f3abf405a8
3 changed files with 32 additions and 11 deletions

View File

@ -159,7 +159,11 @@ bool Foam::noiseModel::read(const dictionary& dict)
dict.readIfPresent("rhoRef", rhoRef_); dict.readIfPresent("rhoRef", rhoRef_);
dict.readIfPresent("N", nSamples_); dict.readIfPresent("N", nSamples_);
customBounds_ = false; customBounds_ = false;
if (dict.readIfPresent("fl", fLower_) || dict.readIfPresent("fu", fUpper_)) if (dict.readIfPresent("fl", fLower_))
{
customBounds_ = true;
}
if (dict.readIfPresent("fu", fUpper_))
{ {
customBounds_ = true; customBounds_ = true;
} }

View File

@ -123,7 +123,7 @@ protected:
//- Upper frequency limit, default = 10kHz //- Upper frequency limit, default = 10kHz
scalar fUpper_; scalar fUpper_;
//- Flagto indicate that custom frequenct bounds are being used //- Flag to indicate that custom frequenct bounds are being used
bool customBounds_; bool customBounds_;
//- Start time, default = 0s //- Start time, default = 0s

View File

@ -504,10 +504,16 @@ void surfaceNoise::calculate()
Info<< "Creating noise FFTs" << endl; Info<< "Creating noise FFTs" << endl;
const scalarField freq1(noiseFFT::frequencies(nSamples_, deltaT_));
// Reset desired frequency range if outside actual frequency range
fLower_ = min(fLower_, max(freq1));
fUpper_ = min(fUpper_, max(freq1));
// Storage for FFT data // Storage for FFT data
const label nLocalFace = pData.size(); const label nLocalFace = pData.size();
const scalarField freq1(noiseFFT::frequencies(nSamples_, deltaT_)); const label nFFT = ceil(freq1.size()/scalar(fftWriteInterval_));
const label nFFT = freq1.size()/fftWriteInterval_;
List<scalarField> surfPrmsf(nFFT); List<scalarField> surfPrmsf(nFFT);
List<scalarField> surfPSDf(nFFT); List<scalarField> surfPSDf(nFFT);
forAll(surfPrmsf, freqI) forAll(surfPrmsf, freqI)
@ -563,7 +569,7 @@ void surfaceNoise::calculate()
// Store the frequency results in slot for face of surface // Store the frequency results in slot for face of surface
forAll(surfPrmsf, i) forAll(surfPrmsf, i)
{ {
label freqI = (i + 1)*fftWriteInterval_ - 1; label freqI = i*fftWriteInterval_;
surfPrmsf[i][faceI] = Prmsf.y()[freqI]; surfPrmsf[i][faceI] = Prmsf.y()[freqI];
surfPSDf[i][faceI] = PSDf.y()[freqI]; surfPSDf[i][faceI] = PSDf.y()[freqI];
} }
@ -588,14 +594,24 @@ void surfaceNoise::calculate()
fileName outDir(baseFileDir()/typeName/fNameBase); fileName outDir(baseFileDir()/typeName/fNameBase);
const scalar deltaf = 1.0/(deltaT_*win.nSamples()); const scalar deltaf = 1.0/(deltaT_*win.nSamples());
Info<< "Writing fft surface data" << endl; Info<< "Writing fft surface data";
if (fftWriteInterval_ == 1)
{
Info<< endl;
}
else
{
Info<< " at every " << fftWriteInterval_ << " frequency points"
<< endl;
}
{ {
// Determine frequency range of interest // Determine frequency range of interest
// Note: freqencies have fixed interval, and are in the range // Note: freqencies have fixed interval, and are in the range
// 0 to (n-1)*deltaf // 0 to fftWriteInterval_*(n-1)*deltaf
label f0 = ceil(fLower_/deltaf); label f0 = ceil(fLower_/deltaf/fftWriteInterval_);
label f1 = floor(fUpper_/deltaf); label f1 = floor(fUpper_/deltaf/fftWriteInterval_);
label nFreq = f1 - f0 + 1; label nFreq = f0 == f1 ? 0 : f1 - f0 + 1;
scalarField PrmsfAve(nFreq, 0); scalarField PrmsfAve(nFreq, 0);
scalarField PSDfAve(nFreq, 0); scalarField PSDfAve(nFreq, 0);
@ -603,9 +619,10 @@ void surfaceNoise::calculate()
for (label i = f0; i <= f1; ++i) for (label i = f0; i <= f1; ++i)
{ {
label freqI = (i + 1)*fftWriteInterval_ - 1; label freqI = i*fftWriteInterval_;
fOut[i] = freq1[freqI]; fOut[i] = freq1[freqI];
const word gName = "fft"; const word gName = "fft";
PrmsfAve[i] = writeSurfaceData PrmsfAve[i] = writeSurfaceData
( (
fNameBase, fNameBase,