From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 0A30E47130 for ; Thu, 27 Jul 2023 22:38:50 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C02F568CA91; Fri, 28 Jul 2023 01:38:47 +0300 (EEST) Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3A7E868C9F4 for ; Fri, 28 Jul 2023 01:38:40 +0300 (EEST) Received: by mail.gandi.net (Postfix) with ESMTPSA id 5C44360002 for ; Thu, 27 Jul 2023 22:38:39 +0000 (UTC) From: Michael Niedermayer To: FFmpeg development discussions and patches Date: Fri, 28 Jul 2023 00:38:36 +0200 Message-Id: <20230727223837.3970793-1-michael@niedermayer.cc> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-GND-Sasl: michael@niedermayer.cc Subject: [FFmpeg-devel] [PATCH 1/2] avradio/sdr: Add CQUAM support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: untested as i have no clean signal from a CQUAM station Signed-off-by: Michael Niedermayer --- libavradio/sdr.h | 1 + libavradio/sdrdemux.c | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/libavradio/sdr.h b/libavradio/sdr.h index 6d11ef794f..b27e6a719e 100644 --- a/libavradio/sdr.h +++ b/libavradio/sdr.h @@ -50,6 +50,7 @@ typedef enum AMMode { AMLeftRight, AMInPhase, AMEnvelope, + AMCQUAM, AMModeNB, } AMMode; diff --git a/libavradio/sdrdemux.c b/libavradio/sdrdemux.c index 3b24cfedef..78c933f6f1 100644 --- a/libavradio/sdrdemux.c +++ b/libavradio/sdrdemux.c @@ -805,13 +805,35 @@ static int demodulate_am(SDRContext *sdr, Station *station, AVStream *st, AVPack wamp = amp/stamp; mm = (AVComplexFloat){dc1.re * amp, -dc1.im * amp}; - for(i = 0; i<2*sdr->am_block_size; i++) { - AVComplexFloat v = sdr->am_iblock[i]; - sdr->am_iblock[i].re = v.re*mm.re - v.im*mm.im - sdr->am_window[i] * wamp; - sdr->am_iblock[i].im = v.re*mm.im + v.im*mm.re; - } + if (am_mode == AMCQUAM) { + double vdotw = 0; + for(i = 0; i<2*sdr->am_block_size; i++) { + AVComplexFloat v = sdr->am_iblock[i]; + float I = v.re*mm.re - v.im*mm.im; + float Q = v.re*mm.im + v.im*mm.re; + float m = sqrt(I*I + Q*Q); + //An ideal signal needs no limit but a real noisy signal can become 0 and negative, The limit of 2.0 is arbitrary and still needs to be tuned once we have real world test signals + float s = Q * FFMIN(m / fabs(I), 2.0); + + sdr->am_iblock[i].re = m; + sdr->am_iblock[i].im = s; + vdotw += sdr->am_window[i] * m; + } + vdotw /= dcw ; + for (i = 0; i<2*sdr->am_block_size; i++) { + float w = sdr->am_window[i]; + sdr->am_iblock[i].re -= w*vdotw; + } - scale = 0.9; + scale = 0.9/vdotw; + } else { + for(i = 0; i<2*sdr->am_block_size; i++) { + AVComplexFloat v = sdr->am_iblock[i]; + sdr->am_iblock[i].re = v.re*mm.re - v.im*mm.im - sdr->am_window[i] * wamp; + sdr->am_iblock[i].im = v.re*mm.im + v.im*mm.re; + } + scale = 0.9; + } } for(i = 0; i<2*sdr->am_block_size; i++) { @@ -832,10 +854,12 @@ static int demodulate_am(SDRContext *sdr, Station *station, AVStream *st, AVPack switch(am_mode) { case AMMidSide: case AMLeftRight: + case AMCQUAM: q = sst->out_buf[2*i+1] + sdr->am_iblock[i ].im * sdr->am_window[i ] * scale; newbuf[2*i+1] = sdr->am_iblock[i + sdr->am_block_size].im * sdr->am_window[i + sdr->am_block_size] * scale; switch(am_mode) { case AMMidSide: + case AMCQUAM: q *= 0.5; sst->out_buf[2*i+0] = m + q; sst->out_buf[2*i+1] = m - q; @@ -2316,6 +2340,7 @@ const AVOption ff_sdr_options[] = { { "am_midside", "AM Demodulation Mid Side", 0, AV_OPT_TYPE_CONST, {.i64 = AMMidSide}, 0, 0, DEC, "am_mode"}, { "am_inphase", "AM Demodulation In Phase", 0, AV_OPT_TYPE_CONST, {.i64 = AMInPhase}, 0, 0, DEC, "am_mode"}, { "am_envelope","AM Demodulation EnvelopeDC", 0, AV_OPT_TYPE_CONST, {.i64 = AMEnvelope}, 0, 0, DEC, "am_mode"}, + { "am_cquam","CQUAM Stereo Demodulation", 0, AV_OPT_TYPE_CONST, {.i64 = AMCQUAM}, 0, 0, DEC, "am_mode"}, { "am_fft_ref", "Use FFT Based carrier for AM demodulation", OFFSET(am_fft_ref), AV_OPT_TYPE_INT , {.i64 = 0}, 0, 1, DEC}, -- 2.31.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".