File: filter_lowpass.cpp

package info (click to toggle)
odin 2.0.5-8
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,196 kB
  • sloc: cpp: 62,638; sh: 4,541; makefile: 779
file content (56 lines) | stat: -rw-r--r-- 1,624 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "filter_lowpass.h"
#include "complexdata.h"

#include <odinpara/ldrfilter.h>

void FilterLowPass::init(){
  freq=0.0;
  freq.set_unit("Hz").set_description("Cut-off frequency");
  append_arg(freq,"freq");
}

bool FilterLowPass::process(Data<float,4>& data, Protocol& prot) const {
  Log<Filter> odinlog(c_label(),"process");

  Range all=Range::all();

  TinyVector<int,4> shape=data.shape();
  int nrep=shape(timeDim);

  ComplexData<4> cdata(float2real(data));

  cdata.partial_fft( TinyVector<bool,4>(true,false,false,false), true);

  int centindex=nrep/2;

  float maxfreq_Hz=1000.0*secureDivision(1.0, prot.seqpars.get_RepetitionTime());

  int cutoffindex=int(secureDivision(freq, maxfreq_Hz)*centindex+0.5);

  int plateauindex=int(0.8*cutoffindex+0.5);

  ODINLOG(odinlog,normalDebug) << "plateauindex/cutoffindex=" << plateauindex << "/" << cutoffindex << STD_endl;

  LDRfilter transition;
  transition.set_function("Gauss");

  for(int i=0; i<(centindex+1); i++) {
    if(i>=plateauindex && i<=cutoffindex) {
      float relpos=secureDivision(i-plateauindex, cutoffindex-plateauindex);
      STD_complex factor(transition.calculate(relpos));
      if((centindex-i)>=0)   cdata(centindex-i, all, all, all)*=factor;
      if((centindex+i)<nrep) cdata(centindex+i, all, all, all)*=factor;

    }
    if(i>cutoffindex) {
      if((centindex-i)>=0)   cdata(centindex-i, all, all, all)=STD_complex(0.0);
      if((centindex+i)<nrep) cdata(centindex+i, all, all, all)=STD_complex(0.0);
    }
  }

  cdata.partial_fft( TinyVector<bool,4>(true,false,false,false), false);

  data=creal(cdata);

  return true;
}