summaryrefslogtreecommitdiffstats
path: root/Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src
diff options
context:
space:
mode:
Diffstat (limited to 'Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src')
-rw-r--r--Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.cpp112
-rw-r--r--Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/MainController.h54
-rw-r--r--Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.cpp114
-rw-r--r--Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGenerator.h38
-rw-r--r--Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/SineGeneratorParameters.h112
-rw-r--r--Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/Util.h62
-rw-r--r--Master/Modellbildung_und_Simulation/Aufgabenblatt1/SineGenerator/src/main.cpp23
7 files changed, 515 insertions, 0 deletions
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 <libglademm/xml.h>
+#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<double>(mParams.getFrequency()),1.0,8000.0)
+ ,mAmpAdj(static_cast<double>(mParams.getAmplitude()),1.0,100.0)
+ ,mPhaseAdj(static_cast<double>(mParams.getPhase()),-180.0,180.0)
+ ,mLengthAdj(static_cast<double>(mParams.getLength()),1.0,60.0)
+{
+ Glib::RefPtr<Gtk::Builder> 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 <gtkmm.h>
+#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 <iostream>
+#endif
+#ifndef _GLIBCXX_CMATH
+ #include <cmath>
+#endif
+#ifndef _GLIBCXX_NUMERIC_LIMITS
+ #include <limits>
+#endif
+#ifndef _STRING_H
+ #include <string.h>
+#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<short>::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 <fstream>
+#endif
+#ifndef _GLIBCXX_VECTOR
+ #include <vector>
+#endif
+
+typedef std::vector<short> 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 <string>
+#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 <sstream>
+#endif
+#ifndef _GLIBMM_USTRING_H
+ #include <glibmm/ustring.h>
+#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 <gtkmm.h>
+#endif
+
+
+int main(int argc, char* argv[])
+{
+ Gtk::Main kit(argc,argv);
+ MainController mainController;
+ mainController.startApp(kit);
+
+ return 0;
+}