【问题标题】:I need to create this sine wave in MATLAB. How does one go about it?我需要在 MATLAB 中创建这个正弦波。怎么做?
【发布时间】:2015-11-29 10:53:39
【问题描述】:

我得到了原始的正弦波(Image 1)和一个嘈杂的版本(Image 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);给我这个结果:

【问题讨论】:

  • 你能发布一些可运行的代码吗?对我来说这看起来不错,你的幅度不应该改变,因为 A 是恒定的,所以不知道你为什么得到这个输出。
  • @lhcgeneva 刚刚做出改变!

标签: matlab plot signal-processing noise trigonometry


【解决方案1】:

你的代码说

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

虽然您的幅度很好且很大并且1,但如果max_index 是整数,那么您在sin 内的相位对于每个t2*pi 的整数倍,恰好为零。这就是为什么您的函数在数值上为零的原因。您需要最大索引的频率

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);

【讨论】:

  • Undefined function or variable 'freq'. 是我尝试将y = A*sin(2*pi*max_index*t); 更改为y = A*sin(2*pi*freq(max_index)*t); 时遇到的错误让我试试你的第二个解决方案。
  • 我还修改了问题,以便它包含有关我如何获得 max_index 值的更多信息。
  • 我也发布了你提到的第二种解决方案的结果。
  • @SharanDuggirala 频率,在您的情况下,max_index 告诉您 1 个时间单位内的振荡次数。如果你的 max_index 等于 20,那么从 t=0t=1 你有 20 个振荡。这就是为什么你看到你所看到的。尝试使用t=linspace(0,2,100) 进行绘图,时间尺度要短得多。
  • @SharanDuggirala 我拒绝相信你真的无法理解我写的内容。查看我的更新答案............
【解决方案2】:

我猜采样率有问题。 替换

t=(1:1:256)

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

这里 f=max_index =21

【讨论】:

  • 这肯定给了我正确的图表,但没有正确的域。我需要它的范围直到 256 像原始信号一样?
  • 您可以使用 t=(1:1/(f*3):256) 更改域。但是,由于频率较低,图形看起来不会像 image1。如果你放大它,那么你会看到输出为 Image 1。
  • 是的,我需要与 Image 1 完全相同的图表。我似乎在这里得到了一个频率更高的不同正弦波。
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多