Berdych ousted Federer, the defending tournament champion, 3-6, 7-6 (10-8), 6-4, just the sixth time in 17 meetings that he has come out ahead of the Swiss star.
Federer took the first set with an eighth-game break but Berdych fought off three match points in taking the extended second-set tiebreaker. Berdych posted his second break in the fifth game of the third set and kept the pressure on Federer, who was unable to manage even a break opportunity in the final set.
Berdych, the tournament's No. 3 seed, takes a 1-12 lifetime record into Saturday's final against Djokovic, who has won the last 10 times they have played.
Djokovic ran his current overall winning streak to 17 matches with a 6-3, 7-6 (7-4) win over fourth-seeded Juan Martin del Potro.
Djokovic cashed in the only break chance of the first set and the players traded a total of four breaks before Djokovic won five of the last six points in the second-set tiebreaker.