The Swiss maestro overcame a sluggish start to beat the Czech 7-6 (1), 6-3, 6-4 in Melbourne, taking two hours and 15 minutes to progress.
He will face the unseeded Hyeon Chung for a place in the final, after he won his quarter-final clash with Tennys Sandgren.
Berdych capitalised on a flat start from Federer to establish a 3-0 lead in the opening set, breaking the No. 2 seed when he sent an errant backhand wide.
Federer's radar was uncharacteristically off, though, which he demonstrated as he failed to put away a simple volley that would have earned him a break point.
He also clashed with the umpire after a challenge went against him, but that was perhaps a sign he had rediscovered his fire—having been 5-2 down, he battled back and saved a set point along the way.
He saved another with Berdych leading 6-5, allowing him to force a tiebreaker, where he handily dismantled the demoralised Czech.
Playing far better than he had at the start of the first, Federer eased comfortably through the second set as Berdych struggled to trouble him, before taking it up a gear to break for a 5-3 lead with some sublime backhands.
The Swiss star soon held a two-set lead.
Berdych returned to the court after a medical timeout ahead of the third set, and his resistance looked to have ended when Federer broke him early on.
He briefly proved that assessment to be premature as he hit back immediately, but in the following game he once again found himself a break down, with Federer sealing it with a backhand down the line.
From there it was straightforward for the 36-year-old to serve out the set and the match.