#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cstdint>
#pragma GCC optimize("O2")
//#pragma GCC target("sse2")
constexpr unsigned int N=16*1024;
float in[N];
int16_t out[N];
//==============================================================================
void f0(const float *src,int16_t *dst,unsigned int numSamples)
{
for(unsigned int i=0; i<numSamples; i++)
{
*dst=(int16_t)(*src * 32767);
dst++; src++;
}
}
void f1(const float *src,int16_t *dst,unsigned int numSamples)
{
for(unsigned int i=0; i<numSamples; i++)
{
float t=*src+384.0f;
memcpy(dst,&t,2);
dst++; src++;
}
}
//==============================================================================
void run(int i)
{
switch(i)
{
case 1:
f1(in,out,N);
break;
default:
f0(in,out,N);
}
for(unsigned int i=0;i<N;i+=2500)
printf("out[%d]=%d\n",i,int(out[i]));
}
//==============================================================================
float get_time()
{
return float(clock())/float(CLOCKS_PER_SEC);
}
float test(int i)
{
float t=get_time();
run(i);
t=get_time()-t;
printf("%.1f ns/sample\n",1.0e+9f*t/float(N));
}
void init()
{
for(unsigned int i=0;i<N;++i)
{
float t=float(rand())/float(RAND_MAX);
in[i]=2.0f*t-1.0f;
}
}
//==============================================================================
int main()
{
init();
test(0);
test(1);
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxjc3RkaW50PgoKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8yIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoInNzZTIiKQoKY29uc3RleHByIHVuc2lnbmVkIGludCBOPTE2KjEwMjQ7CgpmbG9hdCBpbltOXTsKaW50MTZfdCBvdXRbTl07CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKdm9pZCBmMChjb25zdCBmbG9hdCAqc3JjLGludDE2X3QgKmRzdCx1bnNpZ25lZCBpbnQgbnVtU2FtcGxlcykKewoJZm9yKHVuc2lnbmVkIGludCBpPTA7IGk8bnVtU2FtcGxlczsgaSsrKQoJewoJICAqZHN0PShpbnQxNl90KSgqc3JjICogMzI3NjcpOwoJICBkc3QrKzsgc3JjKys7Cgl9Cn0KCnZvaWQgZjEoY29uc3QgZmxvYXQgKnNyYyxpbnQxNl90ICpkc3QsdW5zaWduZWQgaW50IG51bVNhbXBsZXMpCnsKCWZvcih1bnNpZ25lZCBpbnQgaT0wOyBpPG51bVNhbXBsZXM7IGkrKykKCXsKCQlmbG9hdCB0PSpzcmMrMzg0LjBmOwoJICAJbWVtY3B5KGRzdCwmdCwyKTsKCSAgCWRzdCsrOyBzcmMrKzsKCX0KfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnZvaWQgcnVuKGludCBpKQp7CiAgICBzd2l0Y2goaSkKICAgIHsKICAgIAljYXNlIDE6CgkJCWYxKGluLG91dCxOKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJZjAoaW4sb3V0LE4pOwogICAgfQoJZm9yKHVuc2lnbmVkIGludCBpPTA7aTxOO2krPTI1MDApCgkgIHByaW50Zigib3V0WyVkXT0lZFxuIixpLGludChvdXRbaV0pKTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmZsb2F0IGdldF90aW1lKCkKewoJcmV0dXJuIGZsb2F0KGNsb2NrKCkpL2Zsb2F0KENMT0NLU19QRVJfU0VDKTsKfQoKZmxvYXQgdGVzdChpbnQgaSkKewoJZmxvYXQgdD1nZXRfdGltZSgpOwoJcnVuKGkpOwoJdD1nZXRfdGltZSgpLXQ7CglwcmludGYoIiUuMWYgbnMvc2FtcGxlXG4iLDEuMGUrOWYqdC9mbG9hdChOKSk7Cn0KCnZvaWQgaW5pdCgpCnsKCWZvcih1bnNpZ25lZCBpbnQgaT0wO2k8TjsrK2kpCgl7CgkJZmxvYXQgdD1mbG9hdChyYW5kKCkpL2Zsb2F0KFJBTkRfTUFYKTsKCQlpbltpXT0yLjBmKnQtMS4wZjsKCX0KfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmludCBtYWluKCkKewoJaW5pdCgpOwoJdGVzdCgwKTsKCXRlc3QoMSk7CglyZXR1cm4gMDsKfQ==