2

MATLAB の sinc 関数を使用して、サンプリング周波数 800e6 で信号 cos(2*pi*300e6) を再構築しようとしています。次のコードを入力すると、探しているものではなく、非常にノイズの多いものが得られます。私は何を間違っていますか?前もって感謝します!

コード:

F1 = 300e6;
Fs = 800e6;
tmin = 0;
tmax = 10/F1;
t = tmin:1e-12:tmax;
x1 = cos(2*pi*F1*t);
Ts = 1/Fs;
ts = tmin:Ts:tmax;
x1resampled = cos(2*pi*F1*ts);
x1reconstructed = zeros(1,length(t)); %preallocating for speed
samples = length(ts);
for i = 1:1:length(t)
    for n = 1:1:samples
        x1reconstructed(i) = sum(x1resampled(n)*sinc(pi*(t(i)-n*Ts)/Ts));
    end
end
figure(1)
subplot(2,1,1)
plot(t,x1)
hold on
stem(ts,x1resampled)
subplot(2,1,2)
plot(t,x1reconstructed)
4

2 に答える 2

4

コードに関する 2 つの問題:

  1. 再構築されたサンプルが適切に蓄積されていません。具体的には、すべてのサンプルではなく、リサンプリングされた信号から 1 つの値のみを保持しています。

  2. sincMATLAB では、正規化された sinc 関数を使用します。これは、引数に を掛ける必要がないことを意味しますpipi再構成式には正規化された sinc 関数が必要であるため、関数の引数に の乗算がないことを思い出してください。

forしたがって、ループ内のコードを変更するだけです。

F1 = 300e6;
Fs = 800e6;
tmin = 0;
tmax = 10/F1;
t = tmin:1e-12:tmax;
x1 = cos(2*pi*F1*t);
Ts = 1/Fs;
ts = tmin:Ts:tmax;
x1resampled = cos(2*pi*F1*ts);
x1reconstructed = zeros(1,length(t)); %preallocating for speed
samples = length(ts);
for i = 1:1:length(t)
    for n = 1:1:samples
        x1reconstructed(i) = x1reconstructed(i) + x1resampled(n)*sinc((t(i)-n*Ts)/Ts); %%% CHANGE
    end
end
figure(1)
subplot(2,1,1)
plot(t,x1)
hold on
stem(ts,x1resampled)
subplot(2,1,2)
plot(t,x1reconstructed)

私は今、このプロットを取得します:

ここに画像の説明を入力

物事をより効率的にするには、関数を確実に使用しsumますが、すべてのサンプルに対して実行してください。したがって、forループは次のようになります。

for i = 1:1:length(t)
    x1reconstructed(i) = sum(x1resampled .* sinc((t(i) - (1:samples)*Ts) ./ Ts));
end
于 2018-01-28T05:45:06.533 に答える