package jass.generators;
/**
Compute impulse respones of filter.
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class IRPFilter {
private FFTFloat fft=null;
private int bits=0; // len 2^bits FFT
// input to filter
private float[] x = null;
private float[] xim = null;
private float[][]res = null;
private Filter filter = null;
public static void main(String[] argv) {
int n = 4096;
int b=11;
float fs=44100;
Filter filter = new Filter() {
double srate = 44100;
double freq = 440;
double d = 1000;
public void filter(float [] output, float[] input, int nsamples, int inputOffset) {
for(int i=0;i<nsamples;i++) {
output[i] = (float)(Math.sin(2*Math.PI*440*i/srate)*Math.exp(-d*i/srate));
}
}
};
IRPFilter ip = new IRPFilter();
float[][] res = ip.computeIRP(filter, b, fs);
for(int i=0;i<n/2;i++) {
System.out.println(res[i][0]+" "+res[i][1]);
}
res = ip.computeIRP(filter, b, fs);
for(int i=0;i<n/2;i++) {
System.out.println(res[i][0]+" "+res[i][1]);
}
}
/** Compute IRP as dB magnitude of Fourier transform.
@param filter filter
@param bits 2^bits length IRP generated
@param srate sampling rate in Hz
@return array[2^bits][2] with array[i][0] dB and array[i][1] freq. of i.
*/
public float[][] computeIRP(Filter filter, int bits, float srate) {
if(filter != this.filter || bits != this.bits) {
this.bits = bits;
this.filter = filter;
allocate();
}
int n = 1<<bits;
for(int i=0;i<n;i++) {
x[i] = 0;
xim[i]=0;
}
x[0]=1;
int offset=0;
filter.filter(x,x,n,offset);
/*
System.out.println("==============================");
for(int i=0;i<n;i++) {
System.out.println(x[i]);
}
System.out.println("==============================");
*/
fft.doFFT(x,xim,false);
//System.out.println("==============================");
for(int i=0;i<n;i++) {
if(x[i]*x[i]+xim[i]*xim[i] > 0) {
res[i][0] = 200+(float)(10*Math.log10(x[i]*x[i]+xim[i]*xim[i]));
} else {
res[i][0] = (float) (-110);
}
res[i][1] = i*srate/n;
//System.out.println(res[i][0] + " " + res[i][1]);
}
//System.out.println("==============================");
return res;
}
private void allocate() {
fft = new FFTFloat(bits);
int n = 1<<bits;
x = new float[n];
xim = new float[n];
res = new float[n][2];
}
//public voiterd filter(float [] output, float[] input, int nsamples, int inputOffset);
}