[英]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 的速率采樣,您將有效地看到一條直線,因為只會捕獲/采樣峰值。 簡單地說,采樣頻率越高,采樣信號越不模糊。 使用奈奎斯特准則可以是確定所需頻率的一個很好的基點,如上述其他評論中所述。 您可以使用下面的操場腳本進行試驗。
%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
進行繪圖也是一個好主意,這樣您就不能有效地針對樣本索引/數字進行繪圖。 我不完全確定使用meshgrid()
的上下文是什么。 如果您仍然需要在im1
、 im2
、 im3
、 im4
、 im5
和im6
上使用repmat()
函數進行im1
, im6
可以允許您通過使用meshgrid()
傳遞創建的其他行。
在這種情況下,使用了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
。 相對於另一個變量/向量的繪圖解除了相對於樣本索引繪圖的限制。 如果您采集更多樣本,它不會改變水平范圍,因為其范圍由向量t
確定。 在這種480px by 640px
分辨率下480px by 640px
在失去顯着保真度之前,只有如此多的正弦擬合周期,特別是對於高頻正弦曲線。 使用imresize()
函數有助於將圖像調整/ 480px by 640px
為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 運行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.