Cornell University Home Page

DTV Channel Characterization

Terrestrial television broadcast is set to switch entirely to a DTV standard in 2006. This creates a need to determine the characteristics of DTV channels in order to make appropriate design choices for receivers.

In March 2000 the Cornell University Blind Equalization Research Group (BERG, now the BARD Project), in affiliation with NxtWave Communications, Applied Signal Technology, Inc., and the Australian National University Telecommunications Engineering Group, met in Philadelphia to make field measurements of terrestrial DTV channels. The measurements were taken using a yagi hand-held antenna and a highly-directional roof-size antenna. The measurments were taken in a variety of urban, sub-urban and rural locations, for time windows as long as 2 seconds (but generally less).

The raw data was processed using the BARD's SnapperWare (a block-oriented software receiver) embedded in AST's Model 990DTV Digital Television Signal Analysis System. The channel estimation method utilized was, in principle, the Gooch-Harp method (LMS channel identification using pre-equalized data and decisions based on the blindly equalized data).

After demodulating the signal, it was passed through a baud-spaced IIR filter which blindly equalized the channel using CMA. After initial convergence, the estimates were further refined using a decision-directed DFE, which was initialized using the IIR filter taps. Then the output of the decision-directed equalizer was used as a reference signal to identify the transmission channel from the pre-equalized data; i.e., it was assumed that the output was a delayed version of the input, so that this output could be used as the desired signal for an LMS channel identifier.

We processed multiple blocks at intervals within each data record and used them to determine the FIR channel model at different points in the data record. This yielded time-varying plots of the channel taps and the spectrum. These plots were grouped into ``Matlab movies,'' and saved in Quicktime format.



The full paper, presented at CISS 2001, can be found here: DTV Channel Characterization Study



All movies referenced in the paper are located below. They require the Quicktime player, located here, or other software capable of viewing .mov files.

hampton328eSPED (spectrum and eye diagram)

luzerne11SPCM (spectrum and channel model)

luzerne8SPED (spectrum and eye diagram)

mantua7SPED (spectrum and eye diagram)

Downloadable measured DTV signal captures

Here are four of the data records analyzed in the paper referenced above. You may download them for free. Additional, longer data records may be given out upon request, at the discretion of the BARD. These files contain only the raw input data of the receiver. It is oversampled and it is at an intermediate frequency. In order to read these data files, you will need the matlab code listed below. Click here to download the data snapshots. Click on the links below for a brief description of the snapshot and site information and the characteristics of the captured signal.

How to read the data into Matlab

Here is some Matlab code to read data from our DTV files (*.snp). The DTV files were captured using a "Snapper," supplied by applied signal technology, so the data is stored in a particular format. Each data file has a header that contains formatting information, and the Matlab function "getfileinfo.m" reads in this header information.

The Matlab function "getrawdata.m" uses the header information to actually read in data samples, which were captured at a rate of 50 MHz.

The tricky part is that the header must be skipped before you start to read in the data, and the header has two possible lengths. This is why in a constant is added to the starting point in the first few lines of "getrawdata.m". If this is not done, the data will not be read correctly. Some of the important variables in the code are:

If these two functions are executed properly, then the data samples will be stored in the vector rawdata at a sampling rate of 50 MHz.

getfileinfo.m

function getfileinfo(pname,fname)

global FS Stotal Rformat Nformat failure_flg

fid=fopen([pname fname],'r');
fs=0; stotal=0;

bit = 0; % initialize to avoid too many error messages for corrupt
files
for k=1:30   % Read the Header
   line=fgetl(fid);
   if ~isempty(findstr('-bit',line))
      pt=findstr('-bit',line);
      bit=str2num(line(pt-4:pt-1));
   end
   if ~isempty(findstr('SRATE:',line))
      pt=findstr('SRATE:',line);
      fs=str2num(line(pt+6:length(line)))*1e6;
   end
   if ~isempty(findstr('NTAPS:',line))
      line=fgetl(fid);
      stotal=str2num(line);
      line=fgetl(fid);
      Nformat_str = line;
   end
end

fclose(fid);

if bit==8
   rformat='int8';
elseif bit==16
   rformat='int16';
elseif bit==0;
   disp('  ')
   disp([fname,' failed within getfileinfo.m .'])
   disp('  File is corrupt or not a *.snp file.')
   disp('  ')
   failure_flg = 1;
   return;
else
   rformat=[];
end

if ~isempty(findstr('2''s Complement',Nformat_str))
   nformat = 0;
elseif ~isempty(findstr('Offset Binary',Nformat_str))
   nformat = 1;
else
   nformat = -1;
end; 

if (fs==0 | stotal==0 | isempty(rformat) | (nformat == -1))
   disp('  ')
   disp([fname,' failed within getfileinfo.m .'])
   disp('  Unknown Snapper File Format or Not a Snapper File.')
   disp('  ')  
   failure_flg = 1;
   return;
else
   FS=fs;
   Stotal=stotal;
   Rformat=rformat;
   Nformat=nformat;
end   

getrawdata.m

function [rawdata] = getrawdata(start,length)
      
global Rformat Nformat LoadSnpP LoadSnpF
   
fid = fopen([LoadSnpP LoadSnpF],'r');
if strcmp(Rformat,'int8')
   spt=16385+start;
elseif strcmp(Rformat,'int16')
   spt= 8143+start;
end
fseek(fid,spt,'bof');
rawdata = fread(fid,length,Rformat);
if Nformat == 0
   % Do nothing for 2's complement
elseif Nformat == 1
   % Convert offset binary interpreted as 2's-C to 2's-C
   if strcmp(Rformat,'int8')
      Noffset = 2^(8-1);
   elseif strcmp(Rformat,'int16')
      Noffset = 2^(16-1);
   end;
   rawdata = (rawdata<0)*Noffset - (rawdata>=0)*Noffset + rawdata;
end;
fclose(fid);