Testing reception quality: Difference between revisions

From LinuxTVWiki
Jump to navigation Jump to search
m (add Andy's link)
(some formatting; minor edits)
Line 1: Line 1:
= Analogue TV specific tests=

=DVB specific tests=
== Testing all channels and get an average ==
== Testing all channels and get an average ==
=== Why? When? ===
'''Why? When?'''<br>
Script that gets you all channels and averages everything

Can be good when doing major changes to the installation, like replacing cables or installing a masthead amplifier. Create a baseline, then compare.
Can be good when doing major changes to the installation, like replacing cables or installing a masthead amplifier. Create a baseline, then compare.


== Script ==

This following script gets you all channels and averages everything
=== Script ===


#!/usr/bin/perl -w
#!/usr/bin/perl -w
Line 115: Line 116:
Original author: José Oliver Segura
Original author: José Oliver Segura


It requires a channels.conf file, [[tzap]]. Also veryfy the locations of programs and files in the above code.
=== How? ===


Its usage is as such:
Requirements: a channels.conf file, tzap, veryfy the locations of programs and files in the code.

Usage:
perl signaltest.pl
perl signaltest.pl
Which produces output similar to the following sample:

=== Sample output ===


================================================================================
================================================================================
Line 175: Line 173:


== Test a channel continuously ==
== Test a channel continuously ==
=== Why? When? ===
'''Why? When?'''<br>
Having the ability to monitor signal strength is highly useful when pointing/positioning an antenna. Here are two methods:


===Using femon===
Script that tunes a channel and simply converts the Signal strength into a percentage in the tzap output.
Recent versions of femon, a command line utility included in the [[LinuxTV_dvb-apps]] package, have this functionality built-in, and simply require the user to run:


femon -H
Can be good when pointing the antenna.


which provides "human readable" output, as opposed to the default Hexadecimal representation of the varying attributes of the signal.
Recent femon versions have this functionnality built-in by using

femon -H


=== Script ===
=== Script ===
This following script tunes a channel and simply converts the Signal strength into a percentage in the tzap output.


#!/usr/bin/env python
#!/usr/bin/env python
Line 206: Line 205:
berStr = fields[3].split(" ")[1]
berStr = fields[3].split(" ")[1]
ber = int(berStr, 16)
ber = int(berStr, 16)
fields[3] = "ber %08d" % (ber)
fields[3] = "ber %08d" % (ber)reception
print " | ".join(fields)
print " | ".join(fields)


Original author: Matt Doran
Original author is : Matt Doran


It requires a channels.conf file, and [[tzap]]. It would be used by running:

=== How? ===

Requirements: a channels.conf file, tzap

Usage:
tzap channel | tzapfilter.py
tzap channel | tzapfilter.py
which would produce output like the sample shown below:


=== Sample output ===

using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
tuning to 578000000 Hz
tuning to 578000000 Hz
Line 236: Line 227:
status 1f | signal 51.1% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal 51.1% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK


==Also See==
=Also See=
* [http://www.ivtvdriver.org/index.php/Howto:Improve_signal_quality Improving signal quality]
* [http://www.ivtvdriver.org/index.php/Howto:Improve_signal_quality Improving signal quality]



Revision as of 02:10, 9 September 2009

Analogue TV specific tests

DVB specific tests

Testing all channels and get an average

Why? When?
Can be good when doing major changes to the installation, like replacing cables or installing a masthead amplifier. Create a baseline, then compare.

Script

This following script gets you all channels and averages everything

#!/usr/bin/perl -w

# Original script from José Oliver Segura
# From Hex to % for signal strength by Nicolas Will, with help from GT, Feb. 1, 2008
# License unknown....
# Make sure that the tzap and channels.conf locations are correct
#
# Changes 2009-04-21
#   * moved channel.conf variable to begining of script
#   * applied channel.conf to tzap arguments
#   * removed unused variables channelsFEC1 and channelsFEC2
#   * added ignoring of first X output lines to let tuner/decoder settle
#   * sorting output by frequency
#   * changed formating of output to be more readable
#   * added samplesPerChannel variable (used to be hard coded 10)

use strict;
use warnings;

my($tzap) = "/usr/bin/tzap";
my($channelsConf) = $ENV{"HOME"} . "/.tzap/channels.conf";
my($ignoreFirstLines) = 2 ; # sometimes ber/unc can be be extremly high after switching to a new channel
my($samplesPerChannel) = 10 ;

my($tzapArgs) = "-r -c $channelsConf";
my(@channels);
my(%channelsHz);
my(%signalFreqAcum);
my(%signalFreqCount);
my(%berFreqAcum);
my(%berFreqCount);
my(%uncFreqAcum);
my(%uncFreqCount);

sub loadChannels() {
        my $file = $channelsConf;
        open (CHANNELS,"< $file") or die $!;
        while (<CHANNELS>) {
                chomp;
                @_ = split (/:/,$_);
                my $channelName = $_[0];
		$channelsHz{$channelName} = $_[1];
                push(@channels,$channelName);
        }
        close CHANNELS;
}

&loadChannels();
print "Starting...\n";
my $channel;
foreach $channel (@channels) {
	my $count = 0;
	my $ignore = $ignoreFirstLines;
	my $freq = $channelsHz{$channel};

	print "================================================================================";
	print "\n";
	print "Tunning channel $channel ($freq)\n";
        my $zapPid = open ZAP, "$tzap $tzapArgs \"$channel\" 2>&1 |" or die $! . ": $tzap $tzapArgs \"$channel\"";
	while ( $count < $samplesPerChannel && defined( my $line = <ZAP> )  ) {
     		chomp($line);
		if ($line =~ /FE_HAS_LOCK/) {
			if ($ignore > 0 ) {
				print "$line (Ignoring to let tuner/decoder settle.($ignore)\n";
				$ignore--;
				next;
			}
     			#print "$line\n";
			$count++;
			##
			## status 1f | signal a1ae | snr 0000 | ber 00000000 | unc 00000012 | FE_HAS_LOCK
			##
			$line =~ /.+signal (....).+ber (........).+unc (........).+/;
			my $signal = hex $1;
			my $ber = hex $2;
			my $unc = hex $3;
			$signalFreqAcum{$freq} += $signal;
			$signalFreqCount{$freq}++;
			$berFreqAcum{$freq} += $ber;
			$berFreqCount{$freq}++;
			$uncFreqAcum{$freq} += $unc;
			$uncFreqCount{$freq}++;
			print join("\t","Signal: ".int($signal/65536*100)."%","BER ".$ber,"UNC ".$unc),"\n";
		} else {
			print "$line\n";
		}
   	}
	close ZAP;
	print "\n";
}

print "Summary statistics:\n";
print "Frequency\tSignal  \tBer     \tUnc\n";
print "=========\t========\t========\t========\n";
my $freq;
foreach $freq (sort(keys(%signalFreqAcum))) {
	print "$freq\t";
	printf "%6.1f %%",$signalFreqAcum{$freq}/$signalFreqCount{$freq}/65536*100;
	print "\t";
	printf "%8.1f",$berFreqAcum{$freq}/$berFreqCount{$freq};
	print "\t";
	printf "%8.1f",$uncFreqAcum{$freq}/$uncFreqCount{$freq};
	print "\n";
}

Original author: José Oliver Segura

It requires a channels.conf file, tzap. Also veryfy the locations of programs and files in the above code.

Its usage is as such:

perl signaltest.pl

Which produces output similar to the following sample:

================================================================================
Tunning channel DSF (754000000)
using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
tuning to 754000000 Hz
video pid 0x0081, audio pid 0x0082
status 07 | signal 5cbf | snr 0000 | ber 001fffff | unc 00000000 |
status 1f | signal 5c99 | snr 0000 | ber 000002f0 | unc 00000000 | FE_HAS_LOCK (Ignoring to let tuner/decoder settle.(2)
status 1f | signal 5db6 | snr 0000 | ber 00000160 | unc 00000000 | FE_HAS_LOCK (Ignoring to let tuner/decoder settle.(1)
Signal: 36%     BER 1664        UNC 0
Signal: 36%     BER 84272       UNC 254
Signal: 37%     BER 30176       UNC 493
Signal: 36%     BER 27808       UNC 334
Signal: 36%     BER 4528        UNC 185
Signal: 37%     BER 400 UNC 20
Signal: 38%     BER 464 UNC 2
Signal: 38%     BER 816 UNC 0
Signal: 37%     BER 1808        UNC 18
Signal: 36%     BER 7952        UNC 18

================================================================================
Tunning channel n-tv (778000000)
using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
tuning to 778000000 Hz
video pid 0x0101, audio pid 0x0102
status 07 | signal 3e01 | snr 0000 | ber 001fffff | unc 00000188 |
status 1f | signal 3e4f | snr 0000 | ber 00000000 | unc 0000000a | FE_HAS_LOCK (Ignoring to let tuner/decoder settle.(2)
status 1f | signal 3efa | snr 0000 | ber 00000000 | unc 0000000a | FE_HAS_LOCK (Ignoring to let tuner/decoder settle.(1)
Signal: 24%     BER 0   UNC 0
Signal: 24%     BER 0   UNC 0
Signal: 24%     BER 0   UNC 0
Signal: 24%     BER 0   UNC 0
Signal: 23%     BER 0   UNC 0
Signal: 24%     BER 0   UNC 0
Signal: 24%     BER 0   UNC 0
Signal: 23%     BER 0   UNC 0
Signal: 24%     BER 0   UNC 0
Signal: 24%     BER 0   UNC 0

Summary statistics:
Frequency       Signal          Ber             Unc
=========       ========        ========        ========
177500000         68.4 %          9121.6             0.0
191500000         88.4 %             0.0             0.0
506000000         58.9 %             0.0             0.0
522000000         80.5 %             0.0             0.0
570000000         47.3 %            30.4             0.0
658000000         45.1 %         15747.2             0.0
754000000         37.0 %         15988.8           132.4
778000000         24.3 %             0.0             0.0

Test a channel continuously

Why? When?
Having the ability to monitor signal strength is highly useful when pointing/positioning an antenna. Here are two methods:

Using femon

Recent versions of femon, a command line utility included in the LinuxTV_dvb-apps package, have this functionality built-in, and simply require the user to run:

femon -H

which provides "human readable" output, as opposed to the default Hexadecimal representation of the varying attributes of the signal.

Script

This following script tunes a channel and simply converts the Signal strength into a percentage in the tzap output.

#!/usr/bin/env python

import sys

f = sys.stdin
while True:
       l = f.readline().strip()
       fields = l.split(" | ") 
       if len(fields) < 2:
               print l
       else:
               # Sig Strength
               sigStr = fields[1].split(" ")[1]
               sig = int(sigStr, 16) / float(int('ffff', 16))
               fields[1] = "signal %.1f%%" % (sig * 100.0)

               # BER 
               berStr = fields[3].split(" ")[1]
               ber = int(berStr, 16) 
               fields[3] = "ber %08d" % (ber)reception
               print " | ".join(fields)

Original author is : Matt Doran

It requires a channels.conf file, and tzap. It would be used by running:

tzap channel | tzapfilter.py

which would produce output like the sample shown below:

using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
tuning to 578000000 Hz
video pid 0x0000, audio pid 0x0000
status 1f | signal 51.0% | snr 0000 | ber 02097151 | unc 00000000 | FE_HAS_LOCK
status 1f | signal 51.1% | snr 0000 | ber 00000000 | unc 0000000f | FE_HAS_LOCK
status 1f | signal 51.1% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal 51.1% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal 51.0% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal 51.0% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal 51.0% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal 51.1% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal 51.1% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK
status 1f | signal 51.1% | snr 0000 | ber 00000000 | unc 00000000 | FE_HAS_LOCK

Also See