From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../SineGenerator/src/MainController.cpp | 112 ++++++++++++++++++++ .../SineGenerator/src/MainController.h | 54 ++++++++++ .../SineGenerator/src/SineGenerator.cpp | 114 +++++++++++++++++++++ .../SineGenerator/src/SineGenerator.h | 38 +++++++ .../SineGenerator/src/SineGeneratorParameters.h | 112 ++++++++++++++++++++ .../Aufgabenblatt1/SineGenerator/src/Util.h | 62 +++++++++++ .../Aufgabenblatt1/SineGenerator/src/main.cpp | 23 +++++ 7 files changed, 515 insertions(+) create mode 100644 Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.cpp create mode 100644 Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.h create mode 100644 Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.cpp create mode 100644 Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.h create mode 100644 Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGeneratorParameters.h create mode 100644 Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/Util.h create mode 100644 Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/main.cpp (limited to 'Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src') diff --git a/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.cpp b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.cpp new file mode 100644 index 0000000..ed602fd --- /dev/null +++ b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.cpp @@ -0,0 +1,112 @@ +/* + * MainController.cpp + * + * Created on: 31.03.2011 + * Author: sven + */ +#ifndef MAINCONTROLLER_H_ + #include "MainController.h" +#endif +#ifndef UTIL_H_ + #include "Util.h" +#endif +#ifndef SINEGENERATOR_H_ + #include "SineGenerator.h" +#endif +#ifndef _LIBGLADEMM_XML_H + #include +#endif + +const unsigned short MainController::DEFAULT_FREQUENCY = 400; +const unsigned short MainController::DEFAULT_AMPLITUDE = 100; +const unsigned short MainController::DEFAULT_PHASE = 0; +const unsigned short MainController::DEFAULT_LENGTH = 5; +const char* MainController::DEFAULT_WAVEFILENAME = "test.wav"; +const char* MainController::UI_FILENAME="ui/sinegen.glade"; + +MainController::MainController() +: + mParams( + DEFAULT_FREQUENCY + ,DEFAULT_AMPLITUDE + ,DEFAULT_PHASE + ,DEFAULT_LENGTH + ,DEFAULT_WAVEFILENAME + ) + ,mFreqAdj(static_cast(mParams.getFrequency()),1.0,8000.0) + ,mAmpAdj(static_cast(mParams.getAmplitude()),1.0,100.0) + ,mPhaseAdj(static_cast(mParams.getPhase()),-180.0,180.0) + ,mLengthAdj(static_cast(mParams.getLength()),1.0,60.0) +{ + Glib::RefPtr builder = Gtk::Builder::create_from_file(UI_FILENAME); + builder->get_widget("mainwindow",mPtrMainWin); + builder->get_widget("freqField",mPtrFreqField); + builder->get_widget("ampField",mPtrAmpField); + builder->get_widget("phaseField",mPtrPhaseField); + builder->get_widget("lenField",mPtrLengthField); + builder->get_widget("bitrateentry",mPtrBitrateEntry); + builder->get_widget("samplerateentry",mPtrSamplerateEntry); + builder->get_widget("filenameentry",mPtrFilenameEntry); + builder->get_widget("startbutton",mPtrStartBtn); + mPtrAmpField->set_adjustment(mAmpAdj); + mPtrFreqField->set_adjustment(mFreqAdj); + mPtrPhaseField->set_adjustment(mPhaseAdj); + mPtrLengthField->set_adjustment(mLengthAdj); + mPtrBitrateEntry->set_text(Util::ToUString(mParams.getBitrate())); + mPtrSamplerateEntry->set_text(Util::ToUString(mParams.getSamplerate())); + mPtrFilenameEntry->set_text(mParams.getFilename()); + + mPtrMainWin->signal_hide().connect(sigc::ptr_fun(&Gtk::Main::quit)); + mPtrStartBtn->signal_clicked().connect(sigc::mem_fun(this,&MainController::on_startbutton_clicked)); + + mPtrFreqField->signal_value_changed().connect(sigc::mem_fun(this,&MainController::on_freq_changed)); + mPtrAmpField->signal_value_changed().connect(sigc::mem_fun(this,&MainController::on_amp_changed)); + mPtrPhaseField->signal_value_changed().connect(sigc::mem_fun(this,&MainController::on_phase_changed)); + mPtrLengthField->signal_value_changed().connect(sigc::mem_fun(this,&MainController::on_length_changed)); + mPtrFilenameEntry->signal_changed().connect(sigc::mem_fun(this,&MainController::on_filename_changed)); +} + +MainController::~MainController() { + +} + +void MainController::startApp(Gtk::Main& kit) +{ + kit.run(*mPtrMainWin); +} + +void MainController::on_startbutton_clicked() +{ + SineGenerator gen(mParams); + gen.generateWavefile(); +} + +void MainController::on_freq_changed() +{ + Glib::ustring utxt = mPtrFreqField->get_text(); + mParams.setFrequency(Util::ToUShort(utxt)); +} + +void MainController::on_amp_changed() +{ + Glib::ustring buffer = mPtrAmpField->get_text(); + mParams.setAmplitude(Util::ToUShort(buffer)); +} + +void MainController::on_phase_changed() +{ + Glib::ustring buffer = mPtrPhaseField->get_text(); + mParams.setPhase(Util::ToShort(buffer)); +} + +void MainController::on_length_changed() +{ + Glib::ustring buffer = mPtrLengthField->get_text(); + mParams.setLength(Util::ToUShort(buffer)); +} + +void MainController::on_filename_changed() +{ + std::string buffer = mPtrFilenameEntry->get_text().raw(); + mParams.setFilename(buffer); +} diff --git a/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.h b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.h new file mode 100644 index 0000000..6852e51 --- /dev/null +++ b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.h @@ -0,0 +1,54 @@ +/* + * MainController.h + * + * Created on: 31.03.2011 + * Author: sven + */ + +#ifndef MAINCONTROLLER_H_ +#define MAINCONTROLLER_H_ + +#ifndef SINEGENERATORPARAMETERS_H_ + #include "SineGeneratorParameters.h" +#endif +#ifndef _GTKMM_H + #include +#endif + +class MainController { +public: + MainController(); + virtual ~MainController(); + void startApp(Gtk::Main&); +private: + static const unsigned short DEFAULT_FREQUENCY; + static const unsigned short DEFAULT_AMPLITUDE; + static const unsigned short DEFAULT_PHASE; + static const unsigned short DEFAULT_LENGTH; + static const char* DEFAULT_WAVEFILENAME; + static const char* UI_FILENAME; + + Gtk::Window* mPtrMainWin; + Gtk::SpinButton* mPtrFreqField; + Gtk::SpinButton* mPtrAmpField; + Gtk::SpinButton* mPtrPhaseField; + Gtk::SpinButton* mPtrLengthField; + Gtk::Entry* mPtrBitrateEntry; + Gtk::Entry* mPtrSamplerateEntry; + Gtk::Entry* mPtrFilenameEntry; + Gtk::Button* mPtrStartBtn; + SineGeneratorParameters mParams; + Gtk::Adjustment mFreqAdj; + Gtk::Adjustment mAmpAdj; + Gtk::Adjustment mPhaseAdj; + Gtk::Adjustment mLengthAdj; + + void on_startbutton_clicked(); + void on_freq_changed(); + void on_amp_changed(); + void on_phase_changed(); + void on_length_changed(); + void on_filename_changed(); +}; + +#endif /* MAINCONTROLLER_H_ */ diff --git a/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.cpp b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.cpp new file mode 100644 index 0000000..922c44b --- /dev/null +++ b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.cpp @@ -0,0 +1,114 @@ +/* + * SineGenerator.cpp + * + * Created on: 31.03.2011 + * Author: sven + */ +#ifndef SINEGENERATOR_H_ + #include "SineGenerator.h" +#endif +#ifndef _GLIBCXX_IOSTREAM + #include +#endif +#ifndef _GLIBCXX_CMATH + #include +#endif +#ifndef _GLIBCXX_NUMERIC_LIMITS + #include +#endif +#ifndef _STRING_H + #include +#endif +const double SineGenerator::PI=3.141592654; + +SineGenerator::SineGenerator(SineGeneratorParameters& params) +:mParams(params) +{ +} + +SineGenerator::~SineGenerator() { +} + +void SineGenerator::generateWavefile() +{ + std::cout << "Freq: " << mParams.getFrequency() + << " Amp: " << mParams.getAmplitude() + << " Phase: " << mParams.getPhase() + << " Length: " << mParams.getLength() + << " File: " << mParams.getFilename() + << std::endl; + + std::ofstream wavefile; + wavefile.open(mParams.getFilename().c_str(), std::ios::out | std::ios::binary); + int filestart = wavefile.tellp(); + writeWaveHeader(wavefile); + writeWaveData(wavefile); + int fileend = wavefile.tellp(); + int filesize = fileend-filestart-8; + wavefile.seekp(0x4); + wavefile.write((char*) &filesize,sizeof(filesize)); + wavefile.close(); + std::cout << mParams.getFilename() << " written" << std::endl; +} + +void SineGenerator::writeWaveHeader(std::ofstream& wavefile) +{ + const char* riff = "RIFF"; + const char* wave = "WAVE"; + const char* fmt = "fmt "; + int size = 0; + int fmtLen = 16; + short fmtTag = 0x0001; + short channels = 0x0001; + int sampleRate = mParams.getSamplerate(); + short bitsPerSample = mParams.getBitrate(); + short blockAlign = channels * (bitsPerSample / 8); + int bytesPerSecond = sampleRate * blockAlign; + + wavefile.write(riff,strlen(riff)); + wavefile.write((char*)&size,sizeof(size)); + wavefile.write(wave,strlen(wave)); + wavefile.write(fmt,strlen(fmt)); + wavefile.write((char*) &fmtLen,sizeof(fmtLen)); + wavefile.write((char*) &fmtTag,sizeof(fmtTag)); + wavefile.write((char*) &channels,sizeof(channels)); + wavefile.write((char*) &sampleRate,sizeof(sampleRate)); + wavefile.write((char*) &bytesPerSecond,sizeof(bytesPerSecond)); + wavefile.write((char*) &blockAlign,sizeof(blockAlign)); + wavefile.write((char*) &bitsPerSample,sizeof(bitsPerSample)); +} + +void SineGenerator::writeWaveData(std::ofstream& wavefile) +{ + generateData(); + const char* data = "data"; + int dataLen = mData.size() * sizeof(short); + short actData = 0; + DataIter dataIter; + wavefile.write(data,strlen(data)); + wavefile.write((char*) &dataLen,(sizeof(dataLen))); + for (dataIter = mData.begin(); dataIter != mData.end(); dataIter++) + { + actData = *dataIter; + wavefile.write((char*) &actData,(sizeof(actData))); + } +} + +void SineGenerator::generateData() +{ + double actData = 0.0; + double amp = (double)(mParams.getAmplitude()) * ((double) std::numeric_limits::max()) / 100.0; + double phaseRad = (double)(mParams.getPhase()) * PI / 180.0; + double freq = (double)(mParams.getFrequency()); + double twoPi = 2.0 * PI; + short actShort; + for (short second = 0; second < mParams.getLength(); second++) { + for(unsigned short actTime = 0; actTime < mParams.getSamplerate(); actTime++) + { + actData = amp * std::sin((twoPi * freq * ((double) (actTime) / (double) mParams.getSamplerate() ) ) + phaseRad); + actShort = (short) std::floor(actData+.5); + //std::cout << actTime << ". " << actData << " " << actShort << std::endl; + mData.push_back(actShort); + } + } +} diff --git a/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.h b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.h new file mode 100644 index 0000000..d946bfa --- /dev/null +++ b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.h @@ -0,0 +1,38 @@ +/* + * SineGenerator.h + * + * Created on: 31.03.2011 + * Author: sven + */ + +#ifndef SINEGENERATOR_H_ +#define SINEGENERATOR_H_ + +#ifndef SINEGENERATORPARAMETERS_H_ + #include "SineGeneratorParameters.h" +#endif +#ifndef _GLIBCXX_FSTREAM + #include +#endif +#ifndef _GLIBCXX_VECTOR + #include +#endif + +typedef std::vector WaveData; +typedef WaveData::iterator DataIter; + +class SineGenerator { +public: + SineGenerator(SineGeneratorParameters&); + virtual ~SineGenerator(); + void generateWavefile(); +private: + static const double PI; + SineGeneratorParameters& mParams; + WaveData mData; + void writeWaveHeader(std::ofstream&); + void writeWaveData(std::ofstream&); + void generateData(); +}; + +#endif /* SINEGENERATOR_H_ */ diff --git a/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGeneratorParameters.h b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGeneratorParameters.h new file mode 100644 index 0000000..fba6142 --- /dev/null +++ b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGeneratorParameters.h @@ -0,0 +1,112 @@ +/* + * SineGeneratorParameters.h + * + * Created on: 31.03.2011 + * Author: sven + */ + +#ifndef SINEGENERATORPARAMETERS_H_ +#define SINEGENERATORPARAMETERS_H_ + +#ifndef _GLIBCXX_STRING + #include +#endif + +const unsigned short DEFAULT_BITRATE = 16; +const unsigned short DEFAULT_SAMPLERATE = 16000; + +class SineGeneratorParameters { +public: + SineGeneratorParameters() + :mBitrate(DEFAULT_BITRATE),mSamplerate(DEFAULT_SAMPLERATE) {} + + SineGeneratorParameters( + unsigned short freq, + unsigned short amp, + short phase, + unsigned short length + ,const char* filename) + : + mFrequency(freq) + ,mAmplitude(amp) + ,mPhase(phase) + ,mLength(length) + ,mBitrate(DEFAULT_BITRATE) + ,mSamplerate(DEFAULT_SAMPLERATE) + ,mFilename(filename) + { + } + + virtual ~SineGeneratorParameters() {} + + unsigned short getLength() const + { + return mLength; + } + + void setLength(unsigned short mLength) + { + this->mLength = mLength; + } + + unsigned short getAmplitude() const + { + return mAmplitude; + } + + unsigned short getBitrate() const + { + return mBitrate; + } + + std::string getFilename() const + { + return mFilename; + } + + unsigned short getFrequency() const + { + return mFrequency; + } + + short getPhase() const + { + return mPhase; + } + + unsigned short getSamplerate() const + { + return mSamplerate; + } + + void setAmplitude(unsigned short mAmplitude) + { + this->mAmplitude = mAmplitude; + } + + void setFilename(std::string& mFilename) + { + this->mFilename = mFilename; + } + + void setFrequency(unsigned short mFrequency) + { + this->mFrequency = mFrequency; + } + + void setPhase(short mPhase) + { + this->mPhase = mPhase; + } + +private: + unsigned short mFrequency; + unsigned short mAmplitude; + short mPhase; + unsigned short mLength; + const unsigned short mBitrate; + const unsigned short mSamplerate; + std::string mFilename; +}; + +#endif /* SINEGENERATORPARAMETERS_H_ */ diff --git a/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/Util.h b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/Util.h new file mode 100644 index 0000000..6c98299 --- /dev/null +++ b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/Util.h @@ -0,0 +1,62 @@ +/* + * Util.h + * + * Created on: 31.03.2011 + * Author: sven + */ + +#ifndef UTIL_H_ +#define UTIL_H_ + +#ifndef _GLIBCXX_SSTREAM + #include +#endif +#ifndef _GLIBMM_USTRING_H + #include +#endif + +class Util +{ +public: + static Glib::ustring ToUString(unsigned short val) + { + std::ostringstream ssIn; + ssIn << val; + Glib::ustring res = ssIn.str(); + return res; + } + + static Glib::ustring ToUString(double val) + { + std::ostringstream ssIn; + ssIn << val; + Glib::ustring res = ssIn.str(); + return res; + } + + static Glib::ustring ToUString(short val) + { + std::ostringstream ssIn; + ssIn << val; + Glib::ustring res = ssIn.str(); + return res; + } + + static unsigned short ToUShort(Glib::ustring& val) + { + std::istringstream buffer(val.raw()); + unsigned short res; + buffer >> res; + return res; + } + + static short ToShort(Glib::ustring& val) + { + std::istringstream buffer(val.raw()); + short res; + buffer >> res; + return res; + } +}; + +#endif /* UTIL_H_ */ diff --git a/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/main.cpp b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/main.cpp new file mode 100644 index 0000000..3a1b94f --- /dev/null +++ b/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/main.cpp @@ -0,0 +1,23 @@ +/* + * main.cpp + * + * Created on: 31.03.2011 + * Author: sven + */ +#ifndef MAINCONTROLLER_H_ + #include "MainController.h" +#endif + +#ifndef _GTKMM_H + #include +#endif + + +int main(int argc, char* argv[]) +{ + Gtk::Main kit(argc,argv); + MainController mainController; + mainController.startApp(kit); + + return 0; +} -- cgit v1.2.3