an initial experiment, Aug 4 2023
Transmitter RWM in Moscow transmits a CW waveform for around 8 minutes on the half hour, at frequencies that are close to WWV, namely (see https://en.wikipedia.org/wiki/RWM) 4.996 MHz with 5 kW and on 9.996 and 14.996 MHz with 8 kW.[1]
Use a web-SDR receiver in the UK to capture this signal. It's http://thescotts.ddns.net:8073/.
data file: thescotts.ddns.net_2023-08-04T05_59_28Z_9996.08_cwn.wav
data were captured at 12KHz and the detuning gave a beat frequency of around 500 Hz so well into the Nyquist regime.
That gives us insight into propagation variations at the 200 Hz or so level, around 5 mseec. In general if we have an SDR with some instantaneous BW Df, we can detune to get the beat at DR/2 and so 2/DF is the temporal resolution of looking at phase variations.
beat frequency is around 400 Hz, beat period is therefore 2.5 msec and there are around 24 points per beat cycle.
I've convinced myself that a phase change of Phi in the carrier produces the same phase change in the beat signal.
-------------------
matlab code from GPT-4 to look at phase variations:
%% HFcoherence.m
% C. Stubbs Aug 3 with GPT-4 help
% Read in the WAV file
infile='/Users/cstubbs/data/ionosphere/RMV.wav';
[signal, Fs] = audioread(infile);
% Parameters
Fs=12000; % sample rate in Hz
beat=500; % guess of beat freq
Fn = Fs/2; % Nyquist Frequency
T = 1/Fs; % Sampling period in seconds
L = length(signal); % Length of the signal, in samples
t = (0:L-1)*T; % Time vector
Ts = mean(diff(t));
PointsPerCycle=floor(Fs/beat)
windowSize = PointsPerCycle*20; % Size of the sliding window, make it 20 periods
overlap = floor(windowSize/2); % Overlap between successive windows
stepSize = windowSize - overlap; % Step size for sliding window
Fv = linspace(0, 1, fix(windowSize/2)+1)*Fn;
% Preallocate arrays to store amplitude and phase
numWindows = floor((length(signal) - overlap) / stepSize);
amplitude = zeros(1, numWindows);
phase = zeros(1, numWindows);
maxfreq=phase;
% Iterate through the signal with a sliding window
for w = 1:numWindows
% Define the current window
startIdx = (w - 1) * stepSize + 1;
endIdx = startIdx + windowSize - 1;
window = signal(startIdx:endIdx);
window=window-mean(window);
% Compute the Fourier transform of the window
fftWindow = fft(window);
% Find the dominant component
[~, idx] = max(abs(fftWindow));
idx=18;
maxfreq(w)=Fv(idx);
% Compute amplitude and phase of the dominant component
amplitude(w) = abs(fftWindow(idx));
phase(w) = angle(fftWindow(idx));
figure(1)
plot(Fv(2:end),abs(fftWindow(1:end/2)),'ko-')
xlim([0 1000])
grid on
pause(0.01)
shg
end
%% Plot amplitude and phase
figure(5)
plot(maxfreq,'ko-')
grid on
shg
figure(10);
subplot(2,1,1);
plot(amplitude);
title('Amplitude of Dominant Fourier Component');
xlabel('Window');
ylabel('Amplitude');
grid on
subplot(2,1,2);
plot(phase);
title('Phase of Dominant Fourier Component');
xlabel('Window');
ylabel('Phase (radians)');
grid on
%%
figure(20)
comet(amplitude,phase)
shg
figure(30)
plot(amplitude,phase,'ko')
grid on
shg
----------------------------
This does a sliding FFT down the data stream, which is 3 minutes long.
480 data points per FFT window, each of duration 0.377 sec. Adjacent data points are correlated, in triplets due to window overlaps.
There are about 9000 windows over the 3 minute data file.
I computed phase within each window at a fixed frequency of 425 Hz. If this is wrong it just produces a steady drift in phase, can fit that out.
Used the unwrap() function in MATLAB to generate evolution of phase, correcting for 2pi rollover. Did a fit to a straight line and computed residuals from that.
evolution of phase deviations, y axis is cycles. X axis spans duration of 3 min:
Copyright © 2024 The President and Fellows of Harvard College * Accessibility * Support * Request Access * Terms of Use