Added DC filter option to offline audio file loading

This commit is contained in:
Douglas Gillespie 2025-03-19 13:21:51 +00:00
parent 5202408964
commit bb7888ff33
4 changed files with 110 additions and 19 deletions

View File

@ -496,13 +496,7 @@ public class AcquisitionProcess extends PamProcess {
lastStallCheckSamples = 0;
lastStallState = false;
if (acquisitionControl.acquisitionParameters.subtractDC) {
dcFilter = new DCFilter(acquisitionControl.acquisitionParameters.sampleRate,
acquisitionControl.acquisitionParameters.dcTimeConstant, PamConstants.MAX_CHANNELS);
}
else {
dcFilter = null;
}
dcFilter = createDCFilter();
setSampleRate(acquisitionControl.acquisitionParameters.sampleRate, true);
@ -526,6 +520,22 @@ public class AcquisitionProcess extends PamProcess {
}
public DCFilter createDCFilter() {
if (acquisitionControl.acquisitionParameters.subtractDC) {
if (dcFilter == null) {
dcFilter = new DCFilter(acquisitionControl.acquisitionParameters.sampleRate,
acquisitionControl.acquisitionParameters.dcTimeConstant, PamConstants.MAX_CHANNELS);
}
else {
dcFilter.setTimeContant(acquisitionControl.acquisitionParameters.sampleRate, acquisitionControl.acquisitionParameters.dcTimeConstant);
}
}
else {
dcFilter = null;
}
return dcFilter;
}
@Override
public void setSampleRate(float sampleRate, boolean notify) {
acquisitionControl.acquisitionParameters.sampleRate = sampleRate;
@ -1159,6 +1169,10 @@ public class AcquisitionProcess extends PamProcess {
// System.out.println("AquisitionProcess: GetofflineData: " + offlineLoadDataInfo.getCurrentObserver().getObserverName())
// set the DC filter so that offline data benefit from it too
dcFilter = createDCFilter();
rawDataBlock.setDcFilter(dcFilter);
if (acquisitionControl.getOfflineFileServer() == null) {
return PamDataBlock.REQUEST_NO_DATA;
}

View File

@ -12,15 +12,34 @@ public class DCFilter {
private int nChannels;
private double[] background;
private double alpha;
private int[] channelCallCount;
public DCFilter(double sampleRate, double timeConstant, int nChannels) {
this.sampleRate = sampleRate;
this.timeConstant = timeConstant;
this.nChannels = nChannels;
background = new double[nChannels];
setTimeContant(sampleRate, timeConstant);
channelCallCount = new int[nChannels];
}
/**
* Set the time constant
* @param timeConstant
* @param timeConstant2
* @param timeConstant
*/
public void setTimeContant(double sampleRate, double timeConstant) {
this.sampleRate = sampleRate;
this.timeConstant = timeConstant;
alpha = 1-1./(sampleRate*timeConstant);
}
/**
* Filter data in place.
* @param channel
* @param data
*/
public void filterData(int channel, double[] data) {
double x;
double b = background[channel];
@ -33,5 +52,30 @@ public class DCFilter {
// data[i] = x;
}
background[channel] = b;
channelCallCount[channel] ++;
}
public int getChannelCallCount(int channel) {
return channelCallCount[channel];
}
public double getSampleRate() {
return sampleRate;
}
public double getTimeConstant() {
return timeConstant;
}
public int getnChannels() {
return nChannels;
}
public double[] getBackground() {
return background;
}
public double getAlpha() {
return alpha;
}
}

View File

@ -283,18 +283,18 @@ public class WavAudioFile implements PamAudioFileLoader {
}
public static void main(String args[]) {
File wavFile = new File("E:\\SoundNet\\1chan_analysis\\pamguard\\67150826\\mf_wav\\20180529\\PAM_20180529_055114_000.wav");
try {
WavFileInputStream.openInputStream(wavFile);
System.out.println("Wav file opened successfully: " + isSoundFile(wavFile));
} catch (UnsupportedAudioFileException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// public static void main(String args[]) {
//
// File wavFile = new File("E:\\SoundNet\\1chan_analysis\\pamguard\\67150826\\mf_wav\\20180529\\PAM_20180529_055114_000.wav");
// try {
// WavFileInputStream.openInputStream(wavFile);
// System.out.println("Wav file opened successfully: " + isSoundFile(wavFile));
//
// } catch (UnsupportedAudioFileException | IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
@Override
public PamAudioSettingsPane getSettingsPane() {

View File

@ -30,6 +30,7 @@ package PamguardMVC;
import java.util.ListIterator;
import Acquisition.AcquisitionProcess;
import Acquisition.DCFilter;
import Acquisition.RawDataBinaryDataSource;
import PamController.PamController;
import PamDetection.RawDataUnit;
@ -56,6 +57,8 @@ public class PamRawDataBlock extends AcousticDataBlock<RawDataUnit> {
private double[] summaryTotals2 = new double[PamConstants.MAX_CHANNELS];
private double[] summaryMaxVal = new double[PamConstants.MAX_CHANNELS];
private int[] summaryCount = new int[PamConstants.MAX_CHANNELS];
private DCFilter dcFilter;
/**
* Keep a record of the last sample added.
@ -183,6 +186,14 @@ public class PamRawDataBlock extends AcousticDataBlock<RawDataUnit> {
// return; add the data anyway, may get back into synch !!!!
}
prevChannelSample[thisChannel] = pamDataUnit.getStartSample();
if (dcFilter != null) {
int callCount = dcFilter.getChannelCallCount(thisChannel);
dcFilter.filterData(thisChannel, pamDataUnit.getRawData());
if (callCount == 0) {
// run again for luck now that it should have settled.
dcFilter.filterData(thisChannel, pamDataUnit.getRawData());
}
}
// System.out.println(String.format("Sample %d channel %d in %s is in synch - expected sample %d",
// pamDataUnit.getStartSample(), thisChannel, getDataName(), desiredSample));
addSummaryData(thisChannel, pamDataUnit);
@ -609,6 +620,28 @@ public class PamRawDataBlock extends AcousticDataBlock<RawDataUnit> {
return null;
}
/**
* DC filter to use on all incoming data. Don't probably want this in
* normal mode since it's already done in the acquisition thread, but
* have option to do it in viewer mode if it's set from the
* process owning this data block.
* @param dcFilter
*/
public void setDcFilter(DCFilter dcFilter) {
this.dcFilter = dcFilter;
}
/**
* DC filter to use on all incoming data. Don't probably want this in
* normal mode since it's already done in the acquisition thread, but
* have option to do it in viewer mode if it's set from the
* process owning this data block.
* @return
*/
public DCFilter getDcFilter() {
return dcFilter;
}
// @Override