Java 如何制作一个公式,从另一个公式中的值中找到D的值
在我的脉冲波发生器中,我需要从循环频率(f)、循环次数(r)、minDutyCycle(m)和dutyCycle d中找到循环点(c)的值 这是我做的一个公式,它从另一个值中求出dutyCycle(d)的值 D=((c/(f/2))r)+m 我的代数不是最好的,所以我可能用错括号了 这是我的密码Java 如何制作一个公式,从另一个公式中的值中找到D的值,java,algebra,waveform,Java,Algebra,Waveform,在我的脉冲波发生器中,我需要从循环频率(f)、循环次数(r)、minDutyCycle(m)和dutyCycle d中找到循环点(c)的值 这是我做的一个公式,它从另一个值中求出dutyCycle(d)的值 D=((c/(f/2))r)+m 我的代数不是最好的,所以我可能用错括号了 这是我的密码 public class PulseGenerator extends SquareGenerator { // constants public static final doub
public class PulseGenerator extends SquareGenerator {
// constants
public static final double DEF_MIN_DUTY_CYCLE = 0.05;
public static final double DEF_MAX_DUTY_CYCLE = 0.95;
public static final double DEF_CYCLE_FREQ = 2;
public static final double DEF_HOLD_CYCLE = 0;
// instance variables
double minDutyCycle;
double maxDutyCycle;
double cycleFreq;
double holdCycle;
double dutyCycleRange;
boolean setDirection;
// constructor
public PulseGenerator(double amplitude, double frequency, int bitRate,
double duration, double dutyCycle, double minDutyCycle,
double maxDutyCycle, double cycleFreq, double holdCycle) {
super(amplitude, frequency, bitRate, duration, dutyCycle);
// sample data
squareSample = new int[sampleLength];
calculateAmpLimit();
this.dutyCycle = dutyCycle;
waveLength = sampleRate / this.frequency;
this.minDutyCycle = minDutyCycle;
this.maxDutyCycle = maxDutyCycle;
this.cycleFreq = cycleFreq * sampleRate;
this.holdCycle = holdCycle * sampleRate;
dutyCycleRange = this.maxDutyCycle - this.minDutyCycle;
setDirection = false;
}
// one arg cunstructor
public PulseGenerator(double frequency) {
this(AMPLITUDE, frequency, BIT_RATE, DURATION, DEF_DUTY_CYCLE,
DEF_MIN_DUTY_CYCLE, DEF_MAX_DUTY_CYCLE, DEF_CYCLE_FREQ,
DEF_HOLD_CYCLE);
}
// no args constructor
public PulseGenerator() {
this(AMPLITUDE, FREQUENCY, BIT_RATE, DURATION, DEF_DUTY_CYCLE,
DEF_MIN_DUTY_CYCLE, DEF_MAX_DUTY_CYCLE, DEF_CYCLE_FREQ,
DEF_HOLD_CYCLE);
}
// generate waveform method
@Override
public int[] generateWaveForm() {
// define the decimal j
double j = 1;
// define cycle point
// here is where I need to find the value of cycle point
int cyclePoint = (int)((dutyCycle * (cycleFreq / 2) - minDutyCycle) / dutyCycleRange);
System.out.println("Cycle point: " + cyclePoint);
// generate the actual waveform
for (int i = 0; i < sampleLength; i++, j++) {
double waveCycleRatio = waveLength * dutyCycle;
// same as square
// draws the wave
if (j - waveCycleRatio < 0.0) {
finePoint = 1.0;
} else if (j - waveCycleRatio >= 0.0
&& j - waveCycleRatio < 1) {
finePoint = 0 - (j - waveCycleRatio - 0.5) * 2;
} else if (j - waveLength < 0.0) {
finePoint = -1.0;
} else if (j - waveLength >= 0.0) {
finePoint = (j - waveLength - 0.5) * 2;
}
// checks if j is equal to wavelength
if (j == waveLength) {
j = 1;
} else if (j - waveLength > 0.0 && j - waveLength < 1.0) {
j = (j - waveLength);
}
point = (int)(finePoint * ampLimit);
squareSample[i] = point;
if (holdCycle > 0) {
holdCycle--;
} else {
// implementation of formula to find duty cycle
dutyCycle = (cyclePoint / (cycleFreq / 2) * dutyCycleRange)
+ minDutyCycle;
if (cyclePoint < cycleFreq / 2 && !setDirection) {
cyclePoint++;
} else if (cyclePoint >= cycleFreq / 2 && !setDirection) {
cyclePoint--;
setDirection = true;
} else if (cyclePoint > 0 && setDirection) {
cyclePoint--;
} else if (cyclePoint <= 0 && setDirection) {
cyclePoint++;
setDirection = false;
}
}
}
// return the sample data
return squareSample;
}
}
公共类脉冲发生器{
//常数
公共静态最终双定义最小占空比=0.05;
公共静态最终双定义最大占空比=0.95;
公共静态最终双定义循环频率=2;
公共静态最终双定义保持循环=0;
//实例变量
双重思维循环;
双maxDutyCycle;
双循环;
双保持循环;
双占空比;
布尔集合方向;
//建造师
公共脉冲发生器(双振幅、双频率、整数比特率、,
双倍持续时间,双倍责任周期,双倍意识周期,
双maxDutyCycle,双cycleFreq,双holdCycle){
super(振幅、频率、比特率、持续时间、dutyCycle);
//样本数据
squareSample=新整数[sampleLength];
calculateAmpLimit();
this.dutyCycle=dutyCycle;
波长=取样器/该频率;
this.minDutyCycle=minDutyCycle;
this.maxDutyCycle=maxDutyCycle;
this.cycleFreq=cycleFreq*采样器;
this.holdCycle=holdCycle*采样器;
dutyCycleRange=this.maxDutyCycle-this.minDutyCycle;
setDirection=false;
}
//一个arg结构器
公共脉冲发生器(双频){
这(振幅、频率、比特率、持续时间、DEF_占空比、,
DEF_最小占空比、DEF_最大占空比、DEF_循环频率、,
DEF_保持_循环);
}
//无参数构造函数
公共脉冲发生器(){
这(振幅、频率、比特率、持续时间、DEF_占空比、,
DEF_最小占空比、DEF_最大占空比、DEF_循环频率、,
DEF_保持_循环);
}
//波形生成法
@凌驾
public int[]generateWaveForm(){
//定义小数点j
双j=1;
//定义循环点
//这里我需要找到循环点的值
int cyclePoint=(int)((dutyCycle*(cycleFreq/2)-minDutyCycle)/dutyCycleRange);
System.out.println(“循环点:+cyclePoint”);
//生成实际波形
对于(int i=0;i=0.0
&&j-波循环次数<1){
finePoint=0-(j-波动周期-0.5)*2;
}else if(j-波长<0.0){
精细点=-1.0;
}else如果(j-波长>=0.0){
细点=(j-波长-0.5)*2;
}
//检查j是否等于波长
if(j==波长){
j=1;
}否则如果(j-波长>0.0&&j-波长<1.0){
j=(j-波长);
}
点=(int)(精细点*ampLimit);
平方样本[i]=点;
如果(保持周期>0){
保持循环--;
}否则{
//计算占空比公式的实现
dutyCycle=(cyclePoint/(cycleFreq/2)*dutyCycleRange)
+明度周期;
if(循环点=cycleFreq/2&&!setDirection){
循环点--;
setDirection=true;
}else if(循环点>0&&setDirection){
循环点--;
}否则,如果(cyclePoint我认为这条线有点偏离:
int cyclePoint = (int)((dutyCycle * (cycleFreq / 2) - minDutyCycle) / dutyCycleRange);
应该是这样的:
int cyclePoint = (int)((cycleFreq / 2) * (dutyCycle - minDutyCycle) / dutyCycleRange);
此代码行:
int cyclePoint = (int)((dutyCycle * (cycleFreq / 2) - minDutyCycle) / dutyCycleRange);
应替换为:
int cyclePoint = (int) (((dutyCycle - minDutyCycle) * cycleFreq) / (2 * dutyCycleRange));
好的,重新排列d=((C/(F/2))*R)+m
为C
:d-m=(C/(F/2))*R
;(d-m)/R=C/(F/2)
;(F/2)*(d-m)/R=C
谢谢,它解决了这个问题。你真的帮助了我。但我是怎么做到这一点的呢?请看我在开始“好的重新排列”的问题部分的评论.