Phase shift to time delay calculator
This phase shift and time delay calculator converts in both directions for a periodic signal at a specified frequency.
Run — free
Enter a phase angle in degrees to find the equivalent delay in seconds, or enter a delay in seconds to find the corresponding phase angle. The result also includes the signal period and cycle fraction, making it easier to check timing relationships in oscilloscopes, audio systems, control loops, communications links, and other repeating waveforms without rearranging the formula manually.
Relating phase angle to elapsed time
Phase and time describe the same position within a repeating cycle in different ways. A full cycle is 360 degrees, while its duration is the period, equal to one divided by frequency. Therefore, a phase angle represents that angle divided by 360 of one period. To convert phase to delay, the calculator divides the phase angle by 360 and then divides by the frequency. For example, 90 degrees is one quarter of a cycle, so at any frequency its delay is one quarter of that signal's period. This relationship applies to ideal periodic signals regardless of amplitude or waveform shape, provided that the compared points use the same frequency and a consistent phase reference. Positive and negative inputs are both useful: the sign can distinguish a lag from a lead according to the convention used in your circuit, instrument, or simulation. Because sign conventions differ between fields, keep the same convention across measurements instead of assuming that a positive result always has one universal physical meaning. The calculator reports seconds without silently changing units, so millisecond, microsecond, or nanosecond display conversions can be performed explicitly downstream.
Converting a measured delay into degrees
When the time separation is known, phase follows from multiplying the delay by frequency and by 360 degrees per cycle. This direction is especially useful when cursors on an oscilloscope provide a time difference but a specification or control design uses degrees. The returned phase is not forced into a range such as zero to 360 degrees. That is intentional: a delay of more than one period contains information about complete cycles, and reducing it modulo one cycle would discard that information. If you need the equivalent position within a single cycle, reduce the reported cycle count or phase according to the convention required by your application. Frequency must be strictly positive because a zero frequency has no finite period and cannot define phase progression. The input delay may be zero, positive, or negative, and fractional frequencies are supported. For reliable results, make sure the delay and frequency refer to the same steady periodic component. A broadband transient, changing frequency, or unrelated pair of signals cannot be summarized by this single-frequency relationship without additional signal analysis.
Reading and checking the result
The response includes the chosen conversion direction, frequency in hertz, period in seconds, phase in degrees, delay in seconds, and the signed number of cycles. These related values provide useful cross-checks. The period multiplied by frequency should equal one, cycles multiplied by 360 should reproduce the phase, and cycles multiplied by the period should reproduce the delay. Small decimal differences can appear because results are represented as finite JavaScript numbers, but the algorithm rounds output consistently to fifteen significant digits for deterministic use. This calculator models only the mathematical timing relationship; it does not estimate component tolerances, cable dispersion, group delay, clock jitter, or the frequency-dependent phase response of a real network. For a swept measurement, calculate each frequency point separately using its associated phase or delay. Also distinguish phase delay from group delay when working with modulated or broadband signals: this tool converts the phase of one periodic component, while group delay concerns how phase changes with frequency. Used within that scope, the result is suitable for test planning, design notes, automated checks, and quick verification of hand calculations. API requests use the displayed base price placeholder of $0.002.
What you can do with it
Set an oscilloscope delay
Convert a required phase offset at the test frequency into the time separation expected between waveform cursors.
Interpret timing measurements
Turn a measured delay between two periodic signals into degrees for comparison with a phase specification.
Check synchronization designs
Compare clock, audio, control, or communications timing using period, phase, delay, and cycle fraction in one result.
FAQ
What formulas does the calculator use?
Time delay equals phase in degrees divided by 360 times frequency. Phase in degrees equals time delay times frequency times 360.
Can phase or delay be negative?
Yes. Signed values preserve lead or lag information, but you should interpret the sign using the convention of your measurement system.
Why can the phase result exceed 360 degrees?
The result preserves complete cycles. A delay longer than one period naturally corresponds to more than 360 degrees.
Does this calculate group delay?
No. It converts phase and time for one periodic frequency. Group delay requires phase-versus-frequency information.
How much does an API calculation cost?
Each API request uses the base price $0.002. The browser calculation is available directly on the page.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/elec/phase-shift-time \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"conversion":"phase_to_time","frequency_hz":1000,"value":90}'const res = await fetch("https://api.kit.forhosting.com/elec/phase-shift-time", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"conversion": "phase_to_time",
"frequency_hz": 1000,
"value": 90
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/elec/phase-shift-time",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"conversion": "phase_to_time",
"frequency_hz": 1000,
"value": 90
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/elec/phase-shift-time", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"conversion":"phase_to_time","frequency_hz":1000,"value":90}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"conversion":"phase_to_time","frequency_hz":1000,"value":90}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/elec/phase-shift-time", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"conversion": "phase_to_time",
"frequency_hz": 1000,
"value": 90
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "elec.phase_shift_time",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |