我需要在 MATLAB 中创建这个正弦波。如何去做呢?

I need to create this sine wave in MATLAB. How does one go about it?

我得到了原始正弦波(图 1)和它的噪声版本(图 2)。

图片 1

图 2

现在要找到原始信号,我正在查看图表上半部分具有最大值的频率。这将是 21。当我尝试使用下面的代码创建频率为 21 的正弦波时,我得到 Image 3.

的结果
% Creating the Sine Wave
t = (1:1:256); 
A = 1; 
y = A*sin(2*pi*max_index*t);

plot(t,y);

图 3

为什么会这样。我究竟做错了什么?


可运行代码

这是我的函数:

function [  ] = function1b( Sig_noise )

% Max Index is the frequency of the pure tone
noise_f = fft(Sig_noise); 
s_nf = size(noise_f);
size_f = s_nf(2); 
max = 0;
max_index = 1; 
for n = 1:(size_f/2)
    if abs(noise_f(n)) > max 
        max = abs(noise_f(n));
        max_index = n; 
    end
end

% Creating the Sine Wave
t = (1:1:256); 
A = 1; 
y = A*sin(2*pi*max_index*t);

plot(t,y);

end

我从脚本的这一部分调用它:

load('Sig'); % Original Signal
Sig_noise2=awgn(Sig,10);
function1b(Sig_noise2);

安德拉斯的解决方案

这是我似乎得到的结果:

使用linspace(0,2,100);给我这个结果:

你的代码说

t = (1:1:256); 
A = 1; 
y = A*sin(2*pi*max_index*t);

虽然你的振幅很好而且很大 1,但如果 max_index 是整数,那么你在 sin 内的相位是 2*pi 的整数倍 2*pi =19=],正好为零。这就是为什么您的函数在数值上为零。您需要最大索引的频率

y = A*sin(2*pi*freq(max_index)*t);

如果频率存储在 freq 中,或者如果 max_index 已经代表频率,则使用更密集的 t 网格,例如

t = linspace(1,256,1000);

您可能误解了 fft 的输出。来自 help fft:

 For length N input vector x, the DFT is a length N vector X,
 with elements
                     N
       X(k) =       sum  x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1 <= k <= N.
                    n=1

 The inverse DFT (computed by IFFT) is given by
                    N
      x(n) = (1/N) sum  X(k)*exp( j*2*pi*(k-1)*(n-1)/N), 1 <= n <= N.
                   k=1

这意味着频率不是 max_index,而是 (max_index-1)/N 如果您的原始样本有 N 个点。把你有缺陷的大频率变成真正的小频率,解决你的问题。

分解为您:尝试

t = 1:256;
y = A*sin(2*pi*(max_index-1)/length(Sig_noise)*t);

估计采样率有问题。 替换

t=(1:1:256)

t = (1:1/(f*3):3)

这里f=max_index =21