如何在 Matlab 中创建正弦模式?

How to create a sinusoidal pattern in Matlab?

以下是我的代码,用于生成具有各种偏移的正弦条纹图案的多个图像。

f1 = 125; f2 = 100; N = 3;
x = linspace(0,pi*480, 640);
y = linspace(0,pi*640, 480);
[X0, Y0] = meshgrid(x,y);
Z1 = 0; Z2 = 2*pi*1/3; Z3 = 2*pi*2/3;
Teq = roundn((f1*f2)/abs(f1-f2), 2); p = 240;
im1 = 127 + 127*cos(2*f1*X0*pi + Z1);
im2 = 127 + 127*cos(2*f1*X0*pi + Z2);
im3 = 127 + 127*cos(2*f1*X0*pi + Z3);
im4 = 127 + 127*cos(2*f2*X0*pi + Z1);
im5 = 127 + 127*cos(2*f2*X0*pi + Z2);
im6 = 127 + 127*cos(2*f2*X0*pi + Z3);

在这种情况下,如果我使用上面的频率 f1 和 f2,我得到以下结果

但是如果我使用频率 f1 = 110 和 f2 = 140,那么我会得到下面看起来很奇怪的正弦波。

为什么第二张图的周期看起来很奇怪?

正弦条纹如下图所示。显示的正弦波取自像素 y = 240

设置采样点数以适应正弦循环

别名前言:

当使用的采样频率不够高,无法以足够高的保真度有效采样信号时,可能会出现混叠。这方面的一个例子是对频率为 100Hz 的信号进行采样。如果这个 100Hz 信号以 100Hz 的速率采样,您将有效地看到一条直线,因为只有峰值是 captured/sampled。简单地说,采样频率越高,采样信号的模糊性越小。如上面其他评论所述,使用奈奎斯特准则可以作为确定所需频率的良好基点。您可以使用下面的 playground 脚本进行实验。

游乐场脚本:

%Plot 1%
Sampling_Frequency = 100; %Sampling frequency%
Sampling_Period = 1/Sampling_Frequency;

Start_Time = 0;
End_Time = 5;
t = (Start_Time: Sampling_Period: End_Time);

f = 2; %Frequency of sinusoid%
y = sin(2*pi*f*t);
subplot(2,1,1); plot(t,y,'-o');
title("Sinusoid Sampled at: " + num2str(Sampling_Frequency));
xlabel("t"); ylabel("Amplitude");
axis([Start_Time End_Time -1.2 1.2]);

%Plot 2%
Sampling_Frequency = 9; %Sampling frequency%
Sampling_Period = 1/Sampling_Frequency;

Start_Time = 0;
End_Time = 5;
t = (Start_Time: Sampling_Period: End_Time);


f = 2; %Frequency of sinusoid%
y = sin(2*pi*f*t);
subplot(2,1,2); plot(t,y,'-o');
title("Sinusoid Sampled at: " + num2str(Sampling_Frequency));
xlabel("t"); ylabel("Amplitude");
axis([Start_Time End_Time -1.2 1.2]);

在这种情况下使用 pi*480 的倍数可能是个好主意,这样正弦曲线 (2π) 的每个周期都有相同数量的样本点,可以很好地拟合而不会出现混叠。针对另一个自变量(例如时间 t)进行绘图也是一个好主意,这样您就不会有效地针对样本 index/number 进行绘图。我不完全确定使用 meshgrid() 的上下文是什么。如果您仍然需要在 im1im2im3im4im5im6 上使用 repmat() 函数进行复制可以允许您使用 meshgrid().

创建您创建的附加行

频率,f1 = 100 和 f2 = 140:

在这种情况下,使用了 5000*pi*480 个样本。

f1 = 110; 
f2 = 140;

Number_Of_Samples = 5000*pi*480;
x = linspace(0,pi*480, Number_Of_Samples);

Z1 = 0;
Z2 = 2*pi*1/3;
Z3 = 2*pi*2/3;

im1 = 127 + 127*cos(2*pi*f1*x + Z1);
im2 = 127 + 127*cos(2*pi*f1*x + Z2);
im3 = 127 + 127*cos(2*pi*f1*x + Z3);
im4 = 127 + 127*cos(2*pi*f2*x + Z1);
im5 = 127 + 127*cos(2*pi*f2*x + Z2);
im6 = 127 + 127*cos(2*pi*f2*x + Z3);

clf;
plot(im1);   
hold on
plot(im2);   
plot(im3);   
plot(im4);   
plot(im5);   
plot(im6);   
xlim([0 1000]);

关于另一个变量的绘图:

在这种情况下,相对于另一个矢量绘制时间,t。关于另一个 variable/vector 的绘图解除了关于样本索引的绘图的约束。如果您采集更多样本,它不会改变水平范围,因为它的范围由向量 t 决定。在这个 480px by 640px 的分辨率中,在失去显着保真度之前,只有这么多的正弦波拟合周期,尤其是对于高频正弦波。使用 imresize() 函数有助于将图像 resize/decimate 变为 480px by 640px 尺寸。

%******************************************************%
%PARAMETERS THAT CAN BE CHANGED%
%******************************************************%
f = 10; %Frequency of sinusoid%
Sampling_Frequency = 1000; %Sampling frequency%
Start_Time = 0;
End_Time = 5;
%******************************************************%

Sampling_Period = 1/Sampling_Frequency;
t = (Start_Time: Sampling_Period: End_Time);
y = sin(2*pi*f*t);
subplot(2,1,1); plot(t,y,'-o');
title("Sinusoid Sampled at: " + num2str(Sampling_Frequency) + "Hz");
xlabel("t"); ylabel("Amplitude");
axis([Start_Time End_Time -1.2 1.2]);

Image_Height = 480;
im1 = repmat(y,Image_Height,1);
im1 = imresize(im1, [480 640]);
subplot(2,1,2); imshow(im1);
title("Resized Image to be 480px by 640px");
xlabel("Width: 640px"); ylabel("Height: 480px");

最终脚本:使用周期数模拟正弦波频率

此脚本仅使用 Number_Of_Cycles 和传递性 End_Time 来调整绘制的正弦曲线的数量,然后使用 imresize() 获得 480px by 640px 图像尺寸.绘制的正弦曲线越多,最终图像中出现的频率就越高。通过这种方式,您可以以高保真度对低频正弦波进行采样,然后让 imresize() 将正弦波抽取到适当的大小,通过绘制或多或少的正弦波,您可以在图像中获得或多或少的周期。

Number_Of_Cycles = 50;
f = 1; 
Sampling_Frequency = 1000;
Start_Time = 0;
End_Time = Number_Of_Cycles*1/f;
Sampling_Period = 1/Sampling_Frequency;
t = (Start_Time: Sampling_Period: End_Time);
y = cos(2*pi*f*t);
Image_Height = 480;
im1 = repmat(y,Image_Height,1);
im1 = imresize(im1, [480 640]);
subplot(2,3,1); imshow(im1);
title(num2str(Number_Of_Cycles) + " Cycles in Image");


%Main parameter to adjust%
Number_Of_Cycles = 100;
End_Time = Number_Of_Cycles*1/f;
Sampling_Period = 1/Sampling_Frequency;
t = (Start_Time: Sampling_Period: End_Time);
y = cos(2*pi*f*t);
im2 = repmat(y,Image_Height,1);
im2 = imresize(im2, [480 640]);
subplot(2,3,2); imshow(im2);
title(num2str(Number_Of_Cycles) + " Cycles in Image");


%Main parameter to adjust%
Number_Of_Cycles = 5;
End_Time = Number_Of_Cycles*1/f;
t = (Start_Time: Sampling_Period: End_Time);
y = cos(2*pi*f*t);
im3 = repmat(y,Image_Height,1);
im3 = imresize(im3, [480 640]);
subplot(2,3,3); imshow(im3);
title(num2str(Number_Of_Cycles) + " Cycles in Image");


%Main parameter to adjust%
Number_Of_Cycles = 10;
End_Time = Number_Of_Cycles*1/f;
t = (Start_Time: Sampling_Period: End_Time);
y = cos(2*pi*f*t);
im4 = repmat(y,Image_Height,1);
im4 = imresize(im4, [480 640]);
subplot(2,3,4); imshow(im4);
title(num2str(Number_Of_Cycles) + " Cycles in Image");


%Main parameter to adjust%
Number_Of_Cycles = 20;
End_Time = Number_Of_Cycles*1/f;
t = (Start_Time: Sampling_Period: End_Time);
y = cos(2*pi*f*t);
im5 = repmat(y,Image_Height,1);
im5 = imresize(im5, [480 640]);
subplot(2,3,5); imshow(im5);
title(num2str(Number_Of_Cycles) + " Cycles in Image");


%Main parameter to adjust%
Number_Of_Cycles = 80;
End_Time = Number_Of_Cycles*1/f;
t = (Start_Time: Sampling_Period: End_Time);
y = cos(2*pi*f*t);
im6 = repmat(y,Image_Height,1);
im6 = imresize(im6, [480 640]);
subplot(2,3,6); imshow(im6);
title(num2str(Number_Of_Cycles) + " Cycles in Image");

运行 使用 MATLAB R2019b