Skip to content

Commit

Permalink
[media] vivid: sdr cap: few enhancements
Browse files Browse the repository at this point in the history
* Constify struct

* Fix comments

* Fix alignment

* Use modulus to transfer phase angles

* Correct float [-1.0, +1.0] to s8 [-128, 127] conversion

Signed-off-by: Antti Palosaari <[email protected]>
Signed-off-by: Hans Verkuil <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
palosaari authored and mchehab committed Sep 25, 2015
1 parent f335c3f commit 60f6873
Showing 1 changed file with 12 additions and 19 deletions.
31 changes: 12 additions & 19 deletions drivers/media/platform/vivid/vivid-sdr-cap.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ struct vivid_format {
};

/* format descriptions for capture and preview */
static struct vivid_format formats[] = {
static const struct vivid_format formats[] = {
{
.pixelformat = V4L2_SDR_FMT_CU8,
.buffersize = SDR_CAP_SAMPLES_PER_BUF * 2,
Expand Down Expand Up @@ -502,16 +502,10 @@ void vivid_sdr_cap_process(struct vivid_dev *dev, struct vivid_buffer *buf)
s32 fixp_i;
s32 fixp_q;

/*
* TODO: Generated beep tone goes very crackly when sample rate is
* increased to ~1Msps or more. That is because of huge rounding error
* of phase angle caused by used cosine implementation.
*/

/* calculate phase step */
#define BEEP_FREQ 1000 /* 1kHz beep */
src_phase_step = DIV_ROUND_CLOSEST(FIXP_2PI * BEEP_FREQ,
dev->sdr_adc_freq);
dev->sdr_adc_freq);

for (i = 0; i < plane_size; i += 2) {
mod_phase_step = fixp_cos32_rad(dev->sdr_fixp_src_phase,
Expand All @@ -522,17 +516,15 @@ void vivid_sdr_cap_process(struct vivid_dev *dev, struct vivid_buffer *buf)
dev->sdr_fixp_mod_phase += div_s64(s64tmp, M_100000PI);

/*
* Transfer phases to [0 / 2xPI] in order to avoid variable
* Transfer phase angle to [0, 2xPI] in order to avoid variable
* overflow and make it suitable for cosine implementation
* used, which does not support negative angles.
*/
while (dev->sdr_fixp_mod_phase < FIXP_2PI)
dev->sdr_fixp_mod_phase += FIXP_2PI;
while (dev->sdr_fixp_mod_phase > FIXP_2PI)
dev->sdr_fixp_mod_phase -= FIXP_2PI;
dev->sdr_fixp_src_phase %= FIXP_2PI;
dev->sdr_fixp_mod_phase %= FIXP_2PI;

while (dev->sdr_fixp_src_phase > FIXP_2PI)
dev->sdr_fixp_src_phase -= FIXP_2PI;
if (dev->sdr_fixp_mod_phase < 0)
dev->sdr_fixp_mod_phase += FIXP_2PI;

fixp_i = fixp_cos32_rad(dev->sdr_fixp_mod_phase, FIXP_2PI);
fixp_q = fixp_sin32_rad(dev->sdr_fixp_mod_phase, FIXP_2PI);
Expand All @@ -544,17 +536,18 @@ void vivid_sdr_cap_process(struct vivid_dev *dev, struct vivid_buffer *buf)

switch (dev->sdr_pixelformat) {
case V4L2_SDR_FMT_CU8:
/* convert 'fixp float' to u8 */
/* convert 'fixp float' to u8 [0, +255] */
/* u8 = X * 127.5 + 127.5; X is float [-1.0, +1.0] */
fixp_i = fixp_i * 1275 + FIXP_FRAC * 1275;
fixp_q = fixp_q * 1275 + FIXP_FRAC * 1275;
*vbuf++ = DIV_ROUND_CLOSEST(fixp_i, FIXP_FRAC * 10);
*vbuf++ = DIV_ROUND_CLOSEST(fixp_q, FIXP_FRAC * 10);
break;
case V4L2_SDR_FMT_CS8:
/* convert 'fixp float' to s8 */
fixp_i = fixp_i * 1275;
fixp_q = fixp_q * 1275;
/* convert 'fixp float' to s8 [-128, +127] */
/* s8 = X * 127.5 - 0.5; X is float [-1.0, +1.0] */
fixp_i = fixp_i * 1275 - FIXP_FRAC * 5;
fixp_q = fixp_q * 1275 - FIXP_FRAC * 5;
*vbuf++ = DIV_ROUND_CLOSEST(fixp_i, FIXP_FRAC * 10);
*vbuf++ = DIV_ROUND_CLOSEST(fixp_q, FIXP_FRAC * 10);
break;
Expand Down

0 comments on commit 60f6873

Please sign in to comment.