mirror of
https://github.com/PAMGuard/PAMGuard.git
synced 2025-05-07 07:07:23 +00:00
Added DC filter option to offline audio file loading
This commit is contained in:
parent
5202408964
commit
bb7888ff33
src
Acquisition
PamguardMVC
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user