#include "block.h" #include "fir.h" #include "rootraisedcosine.h" class RRCFirTx : public Block { private: InPort < double > * in; OutPort < double > * out; Parameter < long > * onesidelength; Parameter < long > * oversampling; Parameter < double > * rolloff; Parameter < double > * delay; Fir < double > fir; public: RRCFirTx(const Blockopt & blockopt) : Block(blockopt) {} void makeParameters() { onesidelength = new Parameter < long > (this, "onesidelength", 10); oversampling = new Parameter < long > (this, "oversampling", 4); rolloff = new Parameter < double > (this, "rolloff", 0.5); delay = new Parameter < double > (this, "delay", 0); } void makeIOPorts() { in = new InPort < double > (this, "in", 1); out = new OutPort < double > (this, "out", 1); } void initialize() { double deltaT = 1. / double(oversampling->value()); long fulllength = onesidelength->value() * 2 + 1; double firprototype[fulllength]; for (long n = 0; n <= onesidelength->value(); n++) { firprototype[onesidelength->value() - n] = rootraisedcosine(double(-n) * deltaT + delay->value(), rolloff->value()); firprototype[onesidelength->value() + n] = rootraisedcosine(double(n) * deltaT + delay->value(), rolloff->value()); } // calculate power of the prototype double pwr = 0.; for (long n = 0; n < fulllength; n++) pwr += pow(firprototype[n], 2.); pwr *= deltaT; // normalize power to 1 for (long n = 0; n < fulllength; n++) firprototype[n] /= sqrt(pwr); fir.create(fulllength, firprototype); } void go() { out->write(fir.filter(in->read())); } }; PUBLISH(RRCFirTx);