FT8 demod: removed sndfile dependency

This commit is contained in:
f4exb 2023-01-09 02:54:36 +01:00
parent 7cd08ef1e9
commit 65e9d1a167
5 changed files with 71 additions and 68 deletions

View File

@ -18,7 +18,6 @@
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include <sndfile.h>
#include <sys/time.h>
#include <assert.h>
#include <math.h>
@ -37,61 +36,6 @@ double now()
return tv.tv_sec + tv.tv_usec / 1000000.0;
}
void writewav(const std::vector<float> &samples, const char *filename, int rate)
{
float mx = 0;
for (ulong i = 0; i < samples.size(); i++)
{
mx = std::max(mx, std::abs(samples[i]));
}
std::vector<float> v(samples.size());
for (ulong i = 0; i < samples.size(); i++)
{
v[i] = (samples[i] / mx) * 0.95;
}
SF_INFO sf;
sf.channels = 1;
sf.samplerate = rate;
sf.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16;
SNDFILE *f = sf_open(filename, SFM_WRITE, &sf);
assert(f);
sf_write_float(f, v.data(), v.size());
sf_write_sync(f);
sf_close(f);
}
std::vector<float> readwav(const char *filename, int &rate_out)
{
SF_INFO info;
memset(&info, 0, sizeof(info));
SNDFILE *sf = sf_open(filename, SFM_READ, &info);
if (sf == 0)
{
fprintf(stderr, "cannot open %s\n", filename);
exit(1); // XXX
}
rate_out = info.samplerate;
std::vector<float> out;
while (1)
{
float buf[512];
int n = sf_read_float(sf, buf, 512);
if (n <= 0)
break;
for (int i = 0; i < n; i++)
{
out.push_back(buf[i]);
}
}
sf_close(sf);
return out;
}
void writetxt(std::vector<float> v, const char *filename)
{
FILE *fp = fopen(filename, "w");

View File

@ -27,8 +27,6 @@
namespace FT8
{
double now();
void writewav(const std::vector<float> &samples, const char *filename, int rate);
std::vector<float> readwav(const char *filename, int &rate_out);
void writetxt(std::vector<float> v, const char *filename);
std::complex<float> goertzel(std::vector<float> v, int rate, int i0, int n, float hz);
float vmax(const std::vector<float> &v);

View File

@ -325,7 +325,7 @@ void WavFileRecord::writeHeader()
writeHeader(m_sampleFile, header);
}
bool WavFileRecord::readHeader(std::ifstream& sampleFile, Header& header)
bool WavFileRecord::readHeader(std::ifstream& sampleFile, Header& header, bool check)
{
memset(&header, 0, sizeof(Header));
@ -336,7 +336,7 @@ bool WavFileRecord::readHeader(std::ifstream& sampleFile, Header& header)
return false;
}
if (!checkHeader(header)) {
if (check && !checkHeader(header)) {
return false;
}

View File

@ -111,7 +111,7 @@ public:
virtual bool stopRecording() override;
virtual bool isRecording() const override { return m_recordOn; }
static bool readHeader(std::ifstream& samplefile, Header& header);
static bool readHeader(std::ifstream& samplefile, Header& header, bool check=true);
static bool readHeader(QFile& samplefile, Header& header);
static void writeHeader(std::ofstream& samplefile, Header& header);
static void writeHeader(QFile& samplefile, Header& header);

View File

@ -15,10 +15,14 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include "mainbench.h"
#include "dsp/wavfilerecord.h"
#ifdef LINUX
#include "ft8/ft8.h"
#include "ft8/util.h"
#include "ft8/unpack.h"
#include <QMutex>
@ -104,13 +108,70 @@ void MainBench::testFT8(const QString& wavFile)
double budget = 2.5; // compute for this many seconds per cycle
TestFT8Callback testft8Callback;
int rate;
std::vector<float> s = FT8::readwav(wavFile.toStdString().c_str(), rate);
std::ifstream wfile;
#ifdef Q_OS_WIN
wfile.open(m_settings.m_fileName.toStdWString().c_str(), std::ios::binary | std::ios::ate);
#else
wfile.open(wavFile.toStdString().c_str(), std::ios::binary | std::ios::ate);
#endif
WavFileRecord::Header header;
wfile.seekg(0, std::ios_base::beg);
bool headerOK = WavFileRecord::readHeader(wfile, header, false);
if (!headerOK)
{
qDebug("MainBench::testFT8: test file is not a wave file");
return;
}
if (header.m_sampleRate != 12000)
{
qDebug("MainBench::testFT8: wave file sample rate is not 12000 S/s");
return;
}
if (header.m_bitsPerSample != 16)
{
qDebug("MainBench::testFT8: sample size is not 16 bits");
return;
}
if (header.m_audioFormat != 1)
{
qDebug("MainBench::testFT8: wav file format is not PCM");
return;
}
if (header.m_dataHeader.m_size != 360000)
{
qDebug("MainBench::testFT8: wave file size is not 15s at 12000 S/s");
return;
}
const int bufsize = 1000;
int16_t buffer[bufsize];
std::vector<float> samples;
uint32_t remainder = header.m_dataHeader.m_size;
while (remainder != 0)
{
wfile.read((char *) buffer, bufsize*2);
for (int i = 0; i < bufsize; i++) {
samples.push_back(buffer[i] / 32768.0f);
}
remainder -= bufsize*2;
}
wfile.close();
FT8::entry(
s.data(),
s.size(),
0.5 * rate,
rate,
samples.data(),
samples.size(),
0.5 * header.m_sampleRate,
header.m_sampleRate,
150,
3600, // 2900,
hints,