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

I was given the original sine wave(Image 1) and a noisy version of it too(Image 2).

Image 1

Image 2

Now to find the original signal, I am looking at the frequency in the first half of the graph which has the greatest value. This would be 21. When I try to create a sine wave with 21 as a frequency using the code below, I get the result of Image 3.

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

plot(t,y);

Image 3

Why is this the case. What am I doing wrong?


RUNNABLE CODE

Here is my Function:

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

And I am calling it from this part of the script:

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

Andras' Solution

This is the result I seem to be getting:

Using linspace(0,2,100); gives me this result:

Answers


Your code says

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

While your amplitude is nice and big and 1, if max_index is integer then your phase inside the sin is an integer multiple of 2*pi for every t, which is exactly zero. This is why your function is numerically zero. You need the frequency of the max index:

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

if the frequencies are stored in freq, or if max_index already stands for a frequency, then use a denser t mesh, like

t = linspace(1,256,1000);

You might be misinterpreting the output of fft. From 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

That means that the frequencies are not max_index, but (max_index-1)/N if your original sample has N points. This turns your flawed large frequency into the actual small frequency, solving your issues.

To break it down to you: try

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

I guess there is some problem in sampling rate. replace

t=(1:1:256)

with

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

Here f=max_index =21


Need Your Help

using GroupLayout in my frame

java swing

public static class MyDictionaryFrame extends JFrame {

snmp4j snmpwalk with Community String Indexing

java snmp4j

How to do a snmpwalk with snmp4j and Community String Indexing?