我需要在 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
我得到了原始正弦波(图 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