簡體   English   中英

如何在 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,我會得到以下結果

兩個頻率 100 和 125 的正弦波

但是如果我使用頻率 f1 = 110 和 f2 = 140,那么我會得到看起來很奇怪的后續正弦波。

f = 110, 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()的上下文是什么。 如果您仍然需要在im1im2im3im4im5im6上使用repmat()函數進行im1im6可以允許您通過使用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 相對於另一個變量/向量的繪圖解除了相對於樣本索引繪圖的限制。 如果您采集更多樣本,它不會改變水平范圍,因為其范圍由向量t確定。 在這種480px by 640px分辨率下480px by 640px在失去顯着保真度之前,只有如此多的正弦擬合周期,特別是對於高頻正弦曲線。 使用imresize()函數有助於將圖像調整/ 480px by 640px480px 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM