How do I create a single square wave of variable duty cycle and length.

24 ビュー (過去 30 日間)
Krut Mehta
Krut Mehta 2020 年 6 月 9 日
コメント済み: Krut Mehta 2020 年 6 月 12 日
I tried a piece of code for developing a single square wave which consists of user input "duty cycle and length" but there are few inputs when the code doesn't function and returns an error.
function waveform = squareWave(duty_cycle,length_of_wave)
duty_cycle = duty_cycle * length_of_wave; %introduces duty cycle for positive edge
inv_duty = length_of_wave - duty_cycle; %introduces duty cycle for negative edge
oneCycle = [ones(1,duty_cycle),zeros(1,inv_duty)]; % one square wave form
end
This piece works fine and perfectly.
but when i wish to repeat this or apply a recursion to this at certain values it throws in errors.
function waveform = squareWave(length_of_wave,num_cycle, duty_cycle)
duty_cycle = duty_cycle * length_of_wave/num_cycle; %introduces duty cycle for positive edge
inv_duty = length_of_wave/num_cycle - duty_cycle; %introduces duty cycle for negative edge
oneCycle = [ones(1,duty_cycle),zeros(1,inv_duty)]; % one square wave form
waveform = repmat(oneCycle, [1,num_cycle]); %repeating "oneCycle" "num_cycle" times
end
  1 件のコメント
Krut Mehta
Krut Mehta 2020 年 6 月 12 日
Thank you for your input towards my question. When I tried running your snippet the expected output was completely reversed
function waveform = squareWave(length_of_wave,num_cycle, duty_cycle)
duty_cycle = duty_cycle * length_of_wave/num_cycle; %introduces duty cycle for positive edge
inv_duty = length_of_wave/num_cycle - duty_cycle; %introduces duty cycle for negative edge
oneCycle = [ones(1,duty_cycle),zeros(1,inv_duty)]; % one square wave form
waveform = repmat(oneCycle, [1,num_cycle]); %repeating "oneCycle" "num_cycle" times
end
%the expected output for the data squareWave(10,2,0.2) is
% 1 1 0 0 0 1 1 0 0 0
but when I ran your snippet it inculcated the decimal value and took it as an integer but it completely reversed the output
function waveform = squareWave(length_of_wave, num_cycle, duty_cycle)
oneCycleLength = length_of_wave/num_cycle;
t=1:oneCycleLength;
oneCycle(t)=0;
oneCycle(oneCycleLength*duty_cycle+1:end) = 1;
waveform = repmat(oneCycle, [1,num_cycle]);
plot(waveform)
end
% the actual output given by this code for the same data squareWave(10,2,0.2) is
% 0 0 1 1 1 0 0 1 1 1
Thanks again for your Inputs

サインインしてコメントする。

採用された回答

Chidvi Modala
Chidvi Modala 2020 年 6 月 12 日
From my assumption, you are trying to generate a square wave which looks like in the below image, when length_of_wave is 100, num_cycle is 10 and dutycycle is 0.75
In this case your code throws an error because the value of duty_cycle * length_of_wave/num_cycle is not an integer and you are trying to pass this non-integer value to "zeros" function. Hence the error.
You can make use of the following piece of code
function waveform = squareWave(length_of_wave, num_cycle, duty_cycle)
oneCycleLength = length_of_wave/num_cycle;
t=1:oneCycleLength;
oneCycle(t)=0;
oneCycle(oneCycleLength*duty_cycle+1:end) = 1;
waveform = repmat(oneCycle, [1,num_cycle]);
plot(waveform)
end
In the above code, you have to handle the case when length_of_wave = num_cycle

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangePulse and Transition Metrics についてさらに検索

製品


リリース

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by