#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;
dst++; src++;
}
}
void f1(const float *src,int16_t *dst,unsigned int numSamples)
{
for(unsigned int i=0; i<numSamples; i++)
{
float t=*src+12582912.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);
t=2.0f*t-1.0f;
t*=32767.0f;
in[i]=t;
}
in[0]=-32767.0f;
in[15000]=+32767.0f;
}
//==============================================================================
int main()
{
init();
test(0);
test(1);
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RyaW5nPgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDxjc3RkaW50PgoKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8yIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoInNzZTIiKQoKY29uc3RleHByIHVuc2lnbmVkIGludCBOPTE2KjEwMjQ7CgpmbG9hdCBpbltOXTsKaW50MTZfdCBvdXRbTl07CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKdm9pZCBmMChjb25zdCBmbG9hdCAqc3JjLGludDE2X3QgKmRzdCx1bnNpZ25lZCBpbnQgbnVtU2FtcGxlcykKewoJZm9yKHVuc2lnbmVkIGludCBpPTA7IGk8bnVtU2FtcGxlczsgaSsrKQoJewoJICAqZHN0PShpbnQxNl90KSpzcmM7CgkgIGRzdCsrOyBzcmMrKzsKCX0KfQoKdm9pZCBmMShjb25zdCBmbG9hdCAqc3JjLGludDE2X3QgKmRzdCx1bnNpZ25lZCBpbnQgbnVtU2FtcGxlcykKewoJZm9yKHVuc2lnbmVkIGludCBpPTA7IGk8bnVtU2FtcGxlczsgaSsrKQoJewoJCWZsb2F0IHQ9KnNyYysxMjU4MjkxMi4wZjsKCSAgCW1lbWNweShkc3QsJnQsMik7CgkgIAlkc3QrKzsgc3JjKys7Cgl9Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp2b2lkIHJ1bihpbnQgaSkKewogICAgc3dpdGNoKGkpCiAgICB7CiAgICAJY2FzZSAxOgoJCQlmMShpbixvdXQsTik7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWYwKGluLG91dCxOKTsKICAgIH0KCWZvcih1bnNpZ25lZCBpbnQgaT0wO2k8TjtpKz0yNTAwKQoJICBwcmludGYoIm91dFslZF09JWRcbiIsaSxpbnQob3V0W2ldKSk7Cn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpmbG9hdCBnZXRfdGltZSgpCnsKCXJldHVybiBmbG9hdChjbG9jaygpKS9mbG9hdChDTE9DS1NfUEVSX1NFQyk7Cn0KCmZsb2F0IHRlc3QoaW50IGkpCnsKCWZsb2F0IHQ9Z2V0X3RpbWUoKTsKCXJ1bihpKTsKCXQ9Z2V0X3RpbWUoKS10OwoJcHJpbnRmKCIlLjFmIG5zL3NhbXBsZVxuIiwxLjBlKzlmKnQvZmxvYXQoTikpOwp9Cgp2b2lkIGluaXQoKQp7Cglmb3IodW5zaWduZWQgaW50IGk9MDtpPE47KytpKQoJewoJCWZsb2F0IHQ9ZmxvYXQocmFuZCgpKS9mbG9hdChSQU5EX01BWCk7CgkJdD0yLjBmKnQtMS4wZjsKCQl0Kj0zMjc2Ny4wZjsKCQlpbltpXT10OwoJfQoJaW5bMF09LTMyNzY3LjBmOwoJaW5bMTUwMDBdPSszMjc2Ny4wZjsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmludCBtYWluKCkKewoJaW5pdCgpOwoJdGVzdCgwKTsKCXRlc3QoMSk7CglyZXR1cm4gMDsKfQ==