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)
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.
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.
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
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);