ATSC fixups

Hello all,

I have been working on getting gr-atsc running again, I have found a few
speedups and some bugs that prevented ATSC decoding from working with
new
versions of GNURadio. I have put these fixes into a branch that can now
decode signals from my local TV station. The changes are in commit in
this
branch: https://github.com/glneo/gnuradio/tree/atscfixup

Thank you
Andrew

On Sun, Jul 14, 2013 at 12:03 PM, Andrew D.
[email protected]wrote:

I have been working on getting gr-atsc running again, I have found a few
speedups and some bugs that prevented ATSC decoding from working with new
versions of GNURadio. I have put these fixes into a branch that can now
decode signals from my local TV station. The changes are in commit in this
branch: https://github.com/glneo/gnuradio/tree/atscfixup

Andrew, can you detail the difference in implementation between the
atsc_rx.py file you added and the all_atsc.py file that was there
already?

Sure:

  • first the description is correct and not just copied from
    interp_short.py
  • removed the writing to ‘atsc_complex.data’ as this uses a lot of space
    and seems to have no meaning outside of debugging
  • I use interleave_short_to_complex instead of s2s -> s2f -> f2c chain
  • lp_coeffs and duc_coeffs uses input_rate instead of just the number,
    should make changing it easier
  • lp_coeffs no longer arbitrarily adds 3 gain
  • duc now shifts the frequency in the correct direction
  • the root raised cosine filter taps no longer need to be heterodyned
    into
    place as I just use it at baseband
  • the root raised cosine filer gets used now ( for some reason it was
    not
    in the chain before and this was severely causing ISI )
  • lower_edge and upper_edge seemed arbitrary and were not in the right
    spot
    anyway

After this stuff and the reorganization a simple diff would not have
saved
much,
also i’m working on ‘atsc_tx.py’,so ‘all_atsc.py’ would be confusing,
hence
the name change.

Also the other scripts seem unnecessary with the new thread-per-block
sceduler, the also seem to cause
a lot of beginners confusion. So I felt they needed to go.

I have also built a ( semi ) working complex fpll for gr-atsc, this
removes
the need for up-converting and the filtering
after the current fpll, my next atsc_rx will need the new script style.
After I finish updating the bit timing loop
we will be almost real time I believe!

P.S. I could still just do the diff to the old all_atsc.py and rename if
you want.

Thank you
Andrew

On Mon, Jul 15, 2013 at 6:52 PM, Johnathan C.

On 07/15/2013 07:01 PM, Andrew D. wrote:

After this stuff and the reorganization a simple diff would not have
saved much, also i’m working on ‘atsc_tx.py’,so ‘all_atsc.py’ would
be confusing, hence the name change.

First, let me say that I’m very happy this code is getting some
attention. It was originally written to use the low-IF output of a TV
tuner and ADC, and also when GNU Radio only had a single-threaded
scheduler. Later, it was only minimally modified to use the USRP
complex baseband IQ output. (I wasn’t around GNU Radio at the time and
the above is only what I surmise by looking at the code history.)

The changes you describe are more like it would have been written had
the USRP existed at the time.

The all_atsc.py file was a work-in-progress effort by Ben R. that I
merged in, but he and I never finished what we were going to do with it.

Also the other scripts seem unnecessary with the new
thread-per-block sceduler, the also seem to cause a lot of beginners
confusion. So I felt they needed to go.

Agree.

I have also built a ( semi ) working complex fpll for gr-atsc, this
removes the need for up-converting and the filtering after the
current fpll, my next atsc_rx will need the new script style. After I
finish updating the bit timing loop we will be almost real time I
believe!

The upconversion and filtering is a large CPU waste when it could be
done at baseband, but it seems this was just a quick-and-dirty way to
get the baseband IQ from a USRP to look like a low-IF output instead in
order to re-use what was already written and working.

Real-time execution would be a welcome accomplishment!

P.S. I could still just do the diff to the old all_atsc.py and rename
if you want.

No need.

By the way, before any of this can be merged, we’ll need a copyright
assignment from you. I’ll email you off-list about how this works.

Thanks again for working on this.

It was removed and left in fpll.h, i’ll push a fix in just a bit, in
the meantime you could just remove the include line from fpll.h

Thank you
Andrew

Hello,

I git cloned the atscfixup branch and tried building it. Here’s as far
as I
got:

In file included from
/users/mranga/gr-atscfixup/gnuradio/gr-atsc/lib/receiver/atsc_fpll.cc:27:
/users/mranga/gr-atscfixup/gnuradio/gr-atsc/include/gnuradio/atsc/fpll.h:32:44:
error: gnuradio/atsc/diag_output_impl.h: No such file or directory

Perhaps this file was accidentally left out of the repository (?)

Ranga

On Mon, Jul 15, 2013 at 10:56 PM, Johnathan C.
<[email protected]

Yeah, That doesn’t seem to be anything I messed with, anyway I pushed
another commit that if compiles for everyone could be merged into the
Gnuradio master. I found that the “Magic coupling constant” isn’t so
magic
and can be complexly removed and replaced with an AGC block set to a
reference level of 4 ( the mean value of the pseudo-random 1 3 5 7
levels
of the ATSC PAM signal ). So I separated that out of the fpll block. For
some reason I simply cannot make a complex PLL that works the same way
the
old PLL works, I get close but i’m still missing something, once I get
that
figured out it will shave off approximately 12% from the decoding time (
thanks to the new performance counters I can now easily track what my
fix-ups are doing and whats left before real-time decoding ).

Thanks you,
Andrew

On Wed, Aug 7, 2013 at 4:11 PM, Souryal, Michael

OK, pushed, could you see if that works better?

Thank you
Andrew