# Tuner Upper Problem Demo¶

On the amateur radio HF bands, operators need to tune their high power amplifiers that use vacuum tubes. The final impedance matching network needs to be retuned everytime the frequency of operation is changed by more than about 100 KHz. When an operator tunes his amplifier, the signal sounds like a sinewave at a frequency determined by the transmitter being tuned. Normally operators listen to make sure nobody is using the frequency before tuning up, but the way the ionesphere works, you often cannot hear an operator between 100 and maybe 500 miles away, because his signals bounce over you. This causes a rather frequent problem. You will be listening to a friend, and all of a subben a sinewave is drowning him out.

This demo shows how an adaptive LMS filter can be used to solve the problem.

In [1]:

    % Demonstration of LMS algorithm for noise cancellation.  Tuner upper problem.
    % Rich Kozick, Spring 1997
    % Rob Frohne's  modifications for Macintosh 2000
    % and Linux 2006 or so.

    pkg load signal
    clear all

    mu = 0.1;

    Fs=8000; % 8 Khz sampling for Linux.
    T0 = 2;  % 2 seconds

    system("espeak 'Speak the signal.'");
    st = record(T0,Fs);
    %st=audioread('Hello.wav');
    st=st(:,1);

    system("espeak 'Here is the signal.'")
    soundsc(st);

    Ls = length(st);
    T0=length(st)/Fs;
    %  Make the tuner upper noise or even several at the same time.
    t=0:1/Fs:T0-1/Fs;
    n =  5*(sin(2*pi*100*pi*t) + 5*cos(2*pi*600*t) + 4*sin(2*pi*850*t));

    % Add him or them to the desired signal.
    x = st' + n;

    system("espeak 'Here is the noisy signal.'")
    soundsc(x,Fs);

    N = 64;         % Length of adaptive filter

    % LMS algorithm for adaptive noise cancellation

    h = ones(N,1);

    for k=N:Ls
      xk = x(k:-1:(k-N+1));
      y(k) = h'*xk';
      e(k) = y(k);
      h = h - 2*mu*e(k)*xk'/(xk*xk');
    end

    % The signal estimate is in the vector e
    system("espeak 'Here is a scaled version of the tail of the cleaned signal.'");
    skip =1000;
    soundsc(e(skip:length(e)),Fs);

    ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave
    ALSA lib pcm.c:2564:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
    ALSA lib pcm.c:2564:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
    ALSA lib pcm.c:2564:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
    ALSA lib pcm_route.c:869:(find_matching_chmap) Found no matching channel map
    Cannot connect to server socket err = No such file or directory
    Cannot connect to server request channel
    jack server is not running or cannot be started
    JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
    JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
    Cannot connect to server socket err = No such file or directory
    Cannot connect to server request channel
    jack server is not running or cannot be started
    JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
    JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
    ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
    ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
    ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card
    ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card
    ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave
    Cannot connect to server socket err = No such file or directory
    Cannot connect to server request channel
    jack server is not running or cannot be started
    JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
    JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
    ans = 0
    ans = 0

In [ ]: